更新存在的数组laravel 5.5中的项目

时间:2018-06-17 04:31:33

标签: laravel laravel-5.5

我有一个产品表有一个列名图像我将所有图像的名称上传到服务器后存储在其中。

但我的问题是,当我想要更新任何产品,并且我想在图像列中添加更多图片时出现此错误

Array to string conversion (SQL: update `products` set `pro_name` = Test, `images` = A6FC3-091547-2Nx.jpg, `updated_at` = 2018-06-17 03:29:20 where `id` = 1)

这是我的代码:

 public function update(Request $request, $id){

                $images=array();
                if($files=$request->file('images')){
                    foreach($files as $file){
                        $extension = $file->getClientOriginalExtension();
                        $fileName = str_random(5)."-".date('his')."-".str_random(3).".".$extension;
                        $upfolder = "admin/UploadImages"."/";
                        $file->move($upfolder , $fileName);
                        $images[]=$fileName;
                    }
                }


                $pros = Product::find($id);
                $pros->pro_name =   $request->input('pro_name');    
                $pros->pro_code =   $request->input('pro_code');    
                $pros->aval     =   $request->input('aval');    
                $pros->price    =   $request->input('price');   
                $pros->colors   =   $request->input('colors');  
                $pros->images   =   array_merge(explode(",",$pros->images), $images);
                $pros->cat_id   =   $request->input('cat_id');  
                $pros->hide     =   $request->input('hide');    
                $pros->save();
return redirect('products');
    }

提前致谢

3 个答案:

答案 0 :(得分:0)

您需要使用此方法:

array_push($arrayName, Item1, [Item2, Item3]);

我认为您在第10行使用了$images[]=$fileName;,LHS是一个数组,RHS是字符串值。请改用array_push($images, $fileName);

简而言之,我的意思是:

$images[]=$fileName;替换为array_push($images, $fileName);

答案 1 :(得分:0)

在这一行:

$pros->images = array_merge(explode(",", $pros->images), $images);

array_merge()返回一个数组。保存记录时,它会尝试将该数组转换为字符串,从而为您提供错误。

根据您当前的逻辑,您需要在合并后内爆数组:

$pros->images = implode(",", array_merge(explode(",",$pros->images), $images));

现在该字符串将成功保存到数据库中。

另一个特定于Laravel的选项是将images字段添加到$casts模型上的Product数组中。

protected $casts = [
    'images' => 'array',
];

现在,数据将作为字符串存储在数据库中,但只要您访问它,Laravel就会自动将其转换为数组。

如果您更新了上述$casts属性,那么您的代码就是:

$pros->images = array_merge($pros->images, $images);

如果您在数据库中有现有数据,那么您将无法简单地进行此更改,因为Laravel将数组存储为json,而不仅仅是以逗号分隔的列表,并且您现有的数据将不兼容。但是,如果这是新的发展,我建议从这种方法开始。

答案 2 :(得分:0)

就像其他人说的那样,你试图将数组存储为字符串。 使用php的implode()函数是你需要查看的地方。

你也可以像我前面提到的那样观看演员阵容。

替代方式

我不确定你为什么要让自己这么复杂。可能有一个非常明显的原因,但我无法看到它。

为什么不直接使用数据透视表product_product_image创建另一个模型ProductImage,这样就可以在两者上简单地定义属于多个关系

产品

public function images()
{
    return $this->belongsToMany(ProductImage::class);
}

ProductImage

public function products()
{
    return $this->belongsToMany(Product::class);
}

这种方式在您创建产品时

您可以执行以下操作:

$product = Product::create([
    //create your product here.
]);

foreach($request->images[] as $image){
    $product->images()->attach();    
}

然后,当您更新图像时,您可以在页面中显示所有图像,也许是一个简单的ajax调用,在单击时删除图像。简单地称之为:

$product = Product::find($request->product_id);
$image = ProductImage::find($request->image_id);
$product->images()->detach($image);

这意味着在将整个产品更新发回服务器之前,您已删除的任何内容都已完成。

现在,您可以使用我为您的create方法发布的相同功能,将任何新图像添加到您的产品中。

同样,可能有一个原因让你按照自己的方式去做,但我只是向你展示了一种利用laravels功能的替代方法。