如何在Laravel 5中更新一对多(hasMany)关系

san*_*jha 5 php orm laravel eloquent laravel-5

好吧,我使用的是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');
}
Run Code Online (Sandbox Code Playgroud)

我正在提供一个表单界面来更新现有产品。在那我有4个可选的文件上传输入html标签,用于更新或添加产品的(新)图像。请记住,所有这4张图片都是可选的。

所以我的问题是什么是最好的方法(laravel方法)

  1. 更新现有条目product_images
  2. 添加新的(如果提供)
  3. 删除现有(如果已删除)

我知道attachor detach方法(sync)删除所有内容,然后添加提供的内容。但是,如果我们要替换任何现有图像,我想保留ID。

小智 3

老问题,但这里有一个答案。

1 和 2 - 如果未提供现有图像 ID,Laravel 的 updateOrCreate() 方法将更新现有记录并插入新记录。请参阅Eloquent ORM 的更新文档下的“updateOrCreate” 。

$images = App\ProductImage::updateOrCreate(
    ['id' => $id],
    ['field1' => $field1, 'field2' => $field2]
);
Run Code Online (Sandbox Code Playgroud)

3 - 要删除,请在表单中添加删除复选框,将目标图像 ID 作为数组传递...

<input type="checkbox" name="imgsToDelete[]" value="{{$product->image->id}}">
<label>Delete</label>
Run Code Online (Sandbox Code Playgroud)

...然后,在您的产品更新方法中,只需将字段数组传递给 Eloquent 的 destroy() 方法即可。

$imgsToDelete = $request->get('imgsToDelete');
ProductImage::destroy($imgsToDelete);
Run Code Online (Sandbox Code Playgroud)

不要忘记从文件系统中删除存储的图像!