通常,多对多关系将返回如下内容:
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;
}
答案 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'] =
。