具有多功能的Laravel多对多关系
我认为我在发展我的拉威尔技能方面做得很好,但似乎我被卡住了,还不能在网上找到解决办法 我的项目是建立在拉雷维尔和Vue,我试图存储与成分的产品。产品在产品表中。配料表中的配料。我成功地用品牌标识存储了产品,后来检索到了品牌(一对多),但我不知道如何对多对多进行此操作:产品的成分 因为我使用Vue,所以我添加了JSON输出来发布我的数据具有多功能的Laravel多对多关系,laravel,vue.js,eloquent,many-to-many,laravel-controller,Laravel,Vue.js,Eloquent,Many To Many,Laravel Controller,我认为我在发展我的拉威尔技能方面做得很好,但似乎我被卡住了,还不能在网上找到解决办法 我的项目是建立在拉雷维尔和Vue,我试图存储与成分的产品。产品在产品表中。配料表中的配料。我成功地用品牌标识存储了产品,后来检索到了品牌(一对多),但我不知道如何对多对多进行此操作:产品的成分 因为我使用Vue,所以我添加了JSON输出来发布我的数据 public function store() { $product = new Product(); $product->ean =
public function store()
{
$product = new Product();
$product->ean = request('ean');
$product->name = request('productName');
$product->brand_id = request('brandId');
$ingredients = request('ingredients');
$product->save();
}
正如我在上面解释的,保存产品进展顺利。
但现在我需要对$Components数组进行一些操作,我发现了如下行:
$user->roles()->save($role);
因此,我认为我必须对所有成分进行foreach循环,并在其中执行以下操作:
$product->ingredients()->save($ingredient);
我不明白的是什么。此数组将包含已存储的现有配料,但也包含必须添加到配料表中的新配料。如何做到这一点
因此,将新成分存储在它的表中,并将关系存储在雄辩的表中。我可能离得很近,也可能离得很远,有人吗?在循环配料时,查看
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()
将您的$component
添加到新的$product
。完全实现时,您的代码应如下所示:
$product = new Product();
...
$product->save();
foreach($request->input("ingredients") AS $ingredient){
$ingredient = Ingredient::firstOrNew(["name" => $ingredient]);
$product->ingredients()->attach($ingredient->id);
}
attach()
将通过向产品
和成分
之间的轴心添加记录,将此新的或现有的$component
与新的$product
关联。无法使用$product->components()->保存($component)的原因代码>是指这是一个多对多
,需要attach()
<代码>$model->relationship()->save()代码>用于一对多的操作
有关创建方法的完整文档可在此处找到:他也可以在第一个循环中首先或新建,然后将检索/插入的成分的I'd值放入$Components并使用$product->Components()->sync($Components))
out of the foreach可大量同步关系谢谢你的回答。它似乎帮助我更进一步。现在出现一个新错误,似乎没有使用attach()调用发送产品ID:SQLSTATE[23000]:完整性约束冲突:1048列“产品ID”不能为空(SQL:insert intoproduct\u Components
(Components\u ID
,product\u ID
)值(2,)编辑:Nvm,必须放置$product->save()在我的foreachOh之前,顺便说一句,我把firstOrNew()改为firstOrCreate(),这样我就不必手动保存配料了。