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()
将通过在 Product
和 Ingredient
之间添加一条记录来将这个新的或现有的 $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
我认为我的 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()
将通过在 Product
和 Ingredient
之间添加一条记录来将这个新的或现有的 $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