如何在Laravel 5

时间:2017-08-19 19:50:50

标签: php laravel laravel-5 orm eloquent

好吧,我正在使用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方式)

  1. 更新product_images表格
  2. 中的现有条目
  3. 如果提供
  4. ,则添加新的
  5. 删除现有内容(如果已删除)
  6. 我知道要移除所有内容的attachdetach方法(sync),然后添加提供的方法。但是如果我们要替换现有的图像,我想保留id。

1 个答案:

答案 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);

别忘了从文件系统中删除存储的图像!