Laravel 具有多个函数的多对多关系

Laravel Many-To-Many relationship with multiple functions

我认为我的 Laravel 技能发展得很好,但似乎我被卡住了,无法在线找到解决方案。

我的项目是在 Laravel 和 Vue 中建立的,我正在尝试存储带有成分的产品。产品在产品 table 中。配料中的配料table。我成功地用 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();
}

正如我上面所解释的,保存产品进展顺利。 但是现在我需要对 $ingredients 数组做一些事情,我发现了这样的行:

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

所以我想我必须为所有成分做一个 foreach 循环并在其中做这个:

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

我没看懂。该数组将包含已存储的现有成分,但也包含必须添加到成分 table 中的新成分。如何实现?

因此将新成分存储在 table 中,并将关系存储在 eloquent table 中。我可能很近,也可能很远,有人吗?

循环配料时,查看 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() 将通过在 ProductIngredient 之间添加一条记录来将这个新的或现有的 $ingredient 与新的 $product 相关联。您不能使用 $product->ingredients()->save($ingredient); 的原因是这是一个 many-to-many,它需要 attach()$model->relationship()->save(); 用于 one-to-many.

有关创建方法的完整文档可在此处找到:https://laravel.com/docs/5.8/eloquent#other-creation-methods