Laravel 多对多关系,向 "pivot" 添加更多对象?

Laravel many to many relationship, add more objects into "pivot"?

通常多对多关系 return 是这样的:

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

因为您有兴趣修改它 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'] =