首页 > 解决方案 > 此集合实例上不存在 Laravel 属性 [文件名]

问题描述

当我编辑产品时,我也在尝试编辑多个图像,所以如果我上传新图像,旧图像应该被新图像替换,但现在如果我上传图像我收到错误Property [filename] does not exist on this collection instance."并且旧图像不会被删除但新图像已添加。有相关的 products 和 ProductsPhoto 表,在 ProductsPhoto 表中有一个 filename 列和 product_id 列。编辑产品时如何用新图像替换旧图像?

我的代码。

刀片模板

 <input multiple="multiple" name="photos[]" type="file"> 

控制器

 public function update(Request $request)
{
 $product = Product::with('ProductsPhoto')->find($request->product_id,'id');

  if ($request->hasFile('photos')){
        //Add the new photo
        foreach ($request->photos as $photo) {
            $filename = $photo->store('public/photos');
            ProductsPhoto::create([
                'product_id' => $product->id,
                'filename' => $filename
            ]);
        } 
        $oldFilename = $product->ProductsPhoto->filename;
        //Update the database
         $product->ProductsPhoto->filename = $filename;

         //Delete old photo
         Storage::delete($oldFilename);
    }

     $product->save();
  }

标签: phplaravellaravel-5eloquent

解决方案


似乎一个产品有很多 productsPhoto,所以$product->ProductsPhoto是一个集合,而不是一张照片!

我不知道您的实体是如何定义的,尤其是ProductProductPhoto类:但是您应该删除productsPhoto的旧集合

$product->productsPhoto()->delete();

并保存新的:

$newPhotos=[];
foreach ($request->photos as $photo) {
    $filename = $photo->store('public/photos');
    $newPhotos[] = new ProductsPhoto(['filename'=>$filename]);
} 
$product->productsPhoto()->saveMany($newPhotos);

而不是尝试替换文件名


推荐阅读