Laravel有多对多的关系,将更多的对象添加到" pivot"?

时间:2015-01-02 10:42:29

标签: php laravel pivot

通常,多对多关系将返回如下内容:

Product::with('brands')->find(4);

{
  id: 4
  name: 
  price:
  brands: [
    id: 6
    pivot: {
      product_id: 4,
      brand_id: 6,
      // withPivot fields goes here if specified.
      // I want to add extra fields here too, unrelated to the database. e.g. :
      foo: 'bar'
    }

  ],
  suppliers: [

  ]
}

这是在Product.php

中完成的
public function brands()
{
  return $this->belongsToMany('Brand');
}

我们是否可以控制pivot对象的内容?我理解它会吐出两个外键ID以及你所包含的withPivot但是我想添加另一个属性,但我不确定如何做到这一点。 Laravel在幕后神奇地做了所有这些多对多的事情。

做这样的事情会出错(我试图将foo: "bar"添加到每个支点)

public function brands()
{
  $brands = $this->belongsToMany('Brand'); 

  foreach($brands as $brand)
  {
    $brand->foo = 'bar';
  }

  return $brands;
}

1 个答案:

答案 0 :(得分:1)

由于您有兴趣修改JSON输出,您可以覆盖toArray()并在其中添加属性:

public function toArray(){
    foreach($this->brands as $brand){
        $brand->pivot->foo = 'bar';
    }
    return parent::toArray();
}

更新

避免不必要地加载brands关系。您可以先获取数组并检查是否已加载关系

public function toArray(){
    $array = parent::toArray();
    if(isset($array['brands'])){
        foreach($array['brands'] as &$brand){
            $brand['pivot']['foo'] = 'bar';
        }
    }
    return $array;
}

请注意,我在&之前使用$brand通过引用传递数组,而不仅仅是通过值传递数组。否则我必须在循环中做$array['brands'][$index]['pivot']['foo'] =