Обычно отношения многие ко многим возвращают что-то вроде этого:
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
объект? Я понимаю, что он выплевывает два идентификатора внешних ключей и все 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'] =
внутри петли.
Других решений пока нет …