[英]Updating one-to-many relationships with updateOrCreate methods
我的主要模型Tag
与Product
有一对多的关系,其中一个Tag
可以通过DB上的tag_id
关系tag_id
分配许多Products
。
在我的编辑视图中,我允许用户编辑标签products
。 可以在表单请求中添加/编辑/删除这些产品。
表单上的每个product
字段都从request()
数组中获取。 例如: request('title'),request('price')
。
我已将$title[$key]
为request('title')
数组。
接下来我的想法是根据请求数据循环遍历此tag
每个products
和updateOrCreate
。 这里的问题是,没有办法检测特定product
是否确实需要更新。
TagController - 更新产品型号(一对多)
foreach($tag->products as $key => $product){
Product::updateOrCreate([
'id' => $product->id,
],
[
'title' => $title[$key],
'price' => $price[$key],
'detail' => $detail[$key],
'order' => $order[$key],
'tagX' => $tagX[$key],
'tagY' => $tagY[$key],
'thumb' => $img[$key],
]);
}
对于初始tag
更新,我设置了一个if
语句,它对主标签img
起作用很好(尽管很麻烦)。
TagController - 更新标记模型
//Update the tag collection
if($request->hasFile('img')) {
$tag->update([
'name' => $name,
'hashtag' => $hashtag,
'img' => $imgPub,
]);
} else{
$tag->update([
'name' => $name,
'hashtag' => $hashtag,
]);
}
有没有更好的方法来确定product
字段是否在请求中更新?
我非常希望用户能够添加/删除或编辑products
从tag
编辑请求,但如果他们没有被更新,不删除现有的产品图片。 谢谢!
按照我的观点,你走错了路。 标记关系应该是多对多。
您必须在ManyToMany关系中检查Laravel的sync()
方法。 请查看: https : //laravel.com/docs/5.8/eloquent-relationships#many-to-many
注意:请根据您的业务逻辑添加代码。
Product.php
public function products(){
return $this->belongsToMany( 'App\Product', 'product_tags', 'tag_id', 'product_id');
}
Tag.php
public function tags(){
return $this->belongsToMany( 'App\Tag', 'product_tags', 'product_id', 'tag_id');
}
ProductController.php
public function update(Product $products, Request $request){
//update the product
$products->update($request->all());
//attach new tags to the product
$products->tags()->sync($request->input('tag_list'));
return redirect('articles');
}
通常我会在前端做类似的事情
<div class="product">
<!-- For Products that may be edited -->
<input type="hidden" name="id" value={{$product->id??0}}>
<input type="hidden" name="action" value="update">
<input type="text" name="title" value={{$product->title}}>
...
</div>
<div class="product">
<!-- For New Products -->
<input type="hidden" name="id" value=0>
<input type="hidden" name="action" value="add">
<input type="text" name="title" value="New Title">
...
</div>
<div class="product">
<!-- For Deleted Products -->
<input type="hidden" name="id" value={{$product->id}}>
<input type="hidden" name="action" value="delete">
<input type="text" name="title" value="New Title">
...
</div>
使用javascript创建json(产品对象数组)有效负载,并将ajax请求发送到后端
[{'id':101,'title':'product 1','action':'update'},
{'id':102,'title':'product 2','action':'update'},
... ,
{'id':201,'action':'delete'},
{'id':202, 'action':'delete'},
... ,
{'id':0,'title':'new product 1','action':'add'},
{'id':0,'title':'new product 2','action':'add'}]
现在在后端,遍历产品列表并检查操作。 根据行动,采取必要步骤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.