【问题标题】:Eager loading nested relationships using pivot使用枢轴急切加载嵌套关系
【发布时间】:2014-09-19 15:55:16
【问题描述】:

我目前有 4 张桌子:

accessories 
id 

products 
id

product_accessory 
id 
product_id
accessory_id 

product_accessory_adaptor
id 
product_accessory_id 

将它们映射到 Eloquent 模型给了我

自定义枢轴模型:

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'); 
   } 
}

产品及配件型号

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');
   }
}

适配器型号:

class Adaptor extends Eloquent {

   protected $table = 'product_accessory_adaptor';

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

这就是我需要的。急切地为所有带有配件的产品加载属于其枢轴的适配器。我已经尝试过这样的事情,但我不知道如何传递枢轴 ID

在产品模型中

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 替换什么?

【问题讨论】:

  • 请参考您之前关于 Pivot 模型的问题中的 cmets。希望一切都清楚。

标签: database laravel eloquent


【解决方案1】:

无需预先加载与枢轴模型相关的任何内容。它不会这样工作,所以我建议这样做:

$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 - 就像我对您上一个问题的回答一样。

这是将它放在一个地方的方法,即。获取相关配件和相关适配器。

否则你需要这样的东西:

$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();

不太方便..

【讨论】:

  • 实际上这可能有助于可视化我为 json 数据的输出所做的工作:products : [ accessories : [ // accessory belonging to a product adaptors : // adaptors belonging to a product and accessory ] ] 我正在尝试将适配器数据加载到具有正确约束的附件中
  • 我明白这一点,这就是我建议上述解决方案的原因。您可以使用该方法轻松地做您需要的事情,因为accessory 及其adaptors 通过productAccessory 对象耦合在一起。
  • 感谢@deczo,我设法根据您的建议构建了我的数据结构。但是我无法隐藏产品上的 productAccessory 属性,有什么想法吗? laravel.io/bin/4GydX
  • 取消设置,使用$hidden属性隐藏,如果是API则使用transformer。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 2014-12-28
  • 1970-01-01
  • 2017-09-30
  • 2015-08-16
  • 2014-01-26
相关资源
最近更新 更多