好吧,我正在使用Laravel 5.4并且在我需要更新一对多(hasMany)关系的情况下到达。
我有一个products
表和一个product_images
表。下面是我在每个模型中的关系定义。
//Product.php
public function productImages()
{
return $this->hasMany('App\ProductImage');
}
//ProductImage.php
public function product()
{
return $this->belongsTo('App\Product');
}
我正在提供一个表单界面来更新现有产品。在那里我有4个可选的文件上传输入html标签,用于更新或添加产品的(新)图像。请记住,所有这4张图片上传都是可选的。
所以我的问题是什么是最好的方法(laravel方式)
product_images
表格我知道要移除所有内容的attach
或detach
方法(sync
),然后添加提供的方法。但是如果我们要替换现有的图像,我想保留id。
答案 0 :(得分:0)
老问题,但这是一个答案。
1和2 -Laravel的updateOrCreate()方法将更新现有记录并在未提供现有映像ID的情况下插入新记录。请参阅Eloquent ORM's Update documentation下的“ updateOrCreate”。
$images = App\ProductImage::updateOrCreate(
['id' => $id],
['field1' => $field1, 'field2' => $field2]
);
3 -要删除,请在您的表单中添加一个删除复选框,该复选框将目标图像ID作为数组传递...
<input type="checkbox" name="imgsToDelete[]" value="{{$product->image->id}}">
<label>Delete</label>
...然后,在您的产品更新方法中,只需将字段数组传递给Eloquent的destroy()方法。
$imgsToDelete = $request->get('imgsToDelete');
ProductImage::destroy($imgsToDelete);
别忘了从文件系统中删除存储的图像!