Laravel Многие-ко-многим отношения с несколькими функциями - PullRequest
1 голос
/ 26 июня 2019

Я думал, что у меня неплохо получается развивать свои навыки в Laravel, но, похоже, я застрял и пока не могу найти решение онлайн.

Мой проект настроен в Laravel и Vue, и япытаясь хранить продукт с ингредиентами.Продукты находятся в таблице продуктов.Ингредиенты в таблице ингредиентов.Мне удалось сохранить продукт с помощью brand_id, а затем получить марку (один ко многим), но я не знаю, как это сделать для многих ко многим: ингредиенты для продуктов.

Поскольку я работаю с Vue, я добавил вывод JSON, в котором публикуются мои данные.

public function store()
{
    $product = new Product();

    $product->ean =             request('ean');
    $product->name =            request('productName');
    $product->brand_id =        request('brandId');

    $ingredients =              request('ingredients');

    $product->save();
}

Как я объяснил выше, сохранение продукта идет хорошо.Но теперь мне нужно что-то сделать с массивом $ ингридиентов, я нашел строки, подобные этим:

$user->roles()->save($role);

Так что я думаю, что мне нужно сделать цикл foreach для всех ингредиентов, а внутри:

$product->ingredients()->save($ingredient);

Что я не понимаю.Этот массив будет содержать существующие ингредиенты, которые уже сохранены, а также новые ингредиенты, которые необходимо добавить в таблицу ингредиентов.Как заставить это работать?

Так что храните новые ингредиенты в его таблице, а также сохраняйте отношения в красноречивой таблице.Я могу быть рядом, я могу быть далеко, кто-нибудь?

1 Ответ

1 голос
/ 26 июня 2019

Зацикливая ингредиенты, изучите метод firstOrNew():

foreach($request->input("ingredients") AS $ingredient){
  $ingredient = Ingredient::firstOrNew(["name" => $ingredient]);
  // Note: assumed name for column that matches `$ingredient` from array, adjust as needed.
}

Находясь в этом цикле, attach() ваш $ingredient до вашего нового $product.Ваш код должен выглядеть следующим образом, когда он полностью реализован:

$product = new Product();
...
$product->save();

foreach($request->input("ingredients") AS $ingredient){
  $ingredient = Ingredient::firstOrNew(["name" => $ingredient]);
  $product->ingredients()->attach($ingredient->id); 
}

attach() свяжет этот новый или существующий $ingredient с новым $product, добавив запись в сводку между Product и Ingredient.Причина, по которой вы не можете использовать $product->ingredients()->save($ingredient);, заключается в том, что это many-to-many, для которого требуется attach().$model->relationship()->save(); используется для one-to-many.

Полная документация по методам создания может быть найдена здесь: https://laravel.com/docs/5.8/eloquent#other-creation-methods

...