Соотнесите отношения «многие ко многим», добавьте больше объектов в «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 объект? Я понимаю, что он выплевывает два идентификатора внешних ключей и все withPivot Вы включили, но я хочу добавить другое свойство, но я не уверен, как это сделать. Laravel делает все это много-много вещей волшебным образом за кулисами.

Выполнение чего-то подобного выдаст ошибку (я пытаюсь добавить foo: "bar" каждому стержню)

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

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

return $brands;
}

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'] = внутри петли.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]