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'] =
。
通常多对多关系 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'] =
。