首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pivot急切加载嵌套关系

使用pivot急切加载嵌套关系
EN

Stack Overflow用户
提问于 2014-07-28 20:48:56
回答 1查看 1.2K关注 0票数 1

我现在有4张表:

代码语言:javascript
复制
accessories 
id 

products 
id

product_accessory 
id 
product_id
accessory_id 

product_accessory_adaptor
id 
product_accessory_id 

将它们映射到有说服力的模型可以给我

自定义透视表模型:

代码语言:javascript
复制
class ProductAccessory extends Pivot {
   protected $table = 'product_accessory';

   public function product()
   {
      return $this->belongsTo('Product');
   }

   public function accessory()
   {
     return $this->belongsTo('Accessory');
   }

   public function adaptors() {
     return $this->hasMany('Adaptor', 'product_accessory_id'); 
   } 
}

产品和附件模型

代码语言:javascript
复制
class Accessory extends Eloquent {

   public function products()
   {
      return $this->belongsToMany('Product', 'product_accessory', 'accessory_id', 'product_id')->withPivot();
   }

   public function newPivot(Eloquent $parent, array $attributes, $table, $exists) 
   {
      if ($parent instanceof Product) {
          return new ProductAccessory($parent, $attributes, $table, $exists);
      }
      return parent::newPivot($parent, $attributes, $table, $exists);
   }

   public function adaptors()
   {
      return $this->hasManyThrough('Adaptor', 'ProductAccessory', 'accessory_id', 'product_accessory_id');
   }
}

class Product extends Eloquent {

   public function accessories()
   {
      return $this->belongsToMany('Accessory', 'product_accessory', 'product_id', 'accessory_id')->withPivot();
   }

   public function newPivot(Eloquent $parent, array $attributes, $table, $exists) 
   {
      if ($parent instanceof Accessory) {
          return new ProductAccessory($parent, $attributes, $table, $exists);
      }
      return parent::newPivot($parent, $attributes, $table, $exists);
   }

   public function adaptors()
   {
      return $this->hasManyThrough('Adaptor', 'ProductAccessory', 'product_id', 'product_accessory_id');
   }
}

适配器型号:

代码语言:javascript
复制
class Adaptor extends Eloquent {

   protected $table = 'product_accessory_adaptor';

   public function productAccessory() {
      return $this->belongsTo('ProductAccessory');
   }
}

这就是我需要的。急切地装载所有产品与配件与适配器属于他们的枢轴。我试过这样的东西,但我不知道如何传递轴心id

在产品模型中

代码语言:javascript
复制
public function accessories()
{
    return $this->belongsToMany('Compatibility\Accessory', 'product_accessory', 'product_id', 'accessory_id')
                ->withPivot('id', 'accessory_disclaimer')
                ->withTimestamps()
                ->with(['adaptors' => function ($q) {
                    $q->where('product_accessory_id', $this->pivot->id);                       
                }]);
}

有谁知道怎么做吗?我应该用$this->pivot->id替换什么?

EN

回答 1

Stack Overflow用户

发布于 2014-07-28 21:21:34

不需要立即加载与pivot模型相关的任何内容。这样是行不通的,所以我建议这样做:

代码语言:javascript
复制
$products->load('ProductAccessory.accessory', 'ProductAccessory.adaptors');

// then you access related accessory and adaptors through the pivot model
$product = $products->first();

$product->productAccessory->accessory;
$product->productAccessory->adaptors;

// Product model
public function productAccessory()
{
  return $this->hasMany('ProductAccessory');
}

注意:ProductAccessory应该扩展Eloquent (Model),而不是Pivot --就像我之前回答你的问题那样。

这是在一个地方有这个的方式,即。获取相关附件和相关适配器。

否则,您将需要这样的代码:

代码语言:javascript
复制
$product->accessory; // accessory model, so far so good
$product->adaptors; // all adaptors, not so good anymore

// to get adaptors for the accessory we need:
$accessories = $product->adaptors()->where('product_accessories.id', $product->accessory->pivot->id)->get();

不太方便..

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24995629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档