Home > Enterprise >  Replace Old image with new image in laravel
Replace Old image with new image in laravel

Time:09-28

CONTROLLER

   public function updateproduct(Request $request, $id)
   {
    // $this->authorize('Admin' || 'Manager'); 
            $request->validate([
            'name'=>'required',
            'description'=>'required',
            'price'=>'required|numeric',
            'quantity'=>'required|numeric',
        ]);
        $product = Product::where('id', $id)->first();
        if(is_null($product)) {
            $product = new Product();
        }    
        $product->name=$request->name;
        $product->description=$request->description;
        $product->price=$request->price;
        $product->quantity=$request->quantity;    
        
        if($request->hasfile('images')){
            foreach($request->file('images') as $file){
            $imagePath = public_path().'files/'.$request->image;
            if(file_exists($imagePath)){
                unlink($imagePath);
            }
               $name = rand(1,9999).'.'.$file->getClientOriginalName().$file->getClientOriginalExtension();
               if($file->move(public_path().'/files/', $name)){
                Image::create([
                    'images'=>$name,
                    'product_id'=>$product->id,
                    'source'=> 1,
                    ]);
               }         
            }
        }
    $product->update();
    return redirect('/viewproduct');
}

While updating product if I add new images then old images should get replaced by new one. But what happens here is it adds images. Please help me with this. Thanks in advance.

CodePudding user response:

It adds new images because you are using the Image::create method. If I understood correctly, you want to modify the images of your products in the image table.

Try to modify your code like :

$updateImage = Image::firstWhere('product_id', $product->id);
$updateImage->images = $name;
$updateImage->source = 1;
$updateImage->save(); 

CodePudding user response:

Your code is somewhat confusing, I'm afraid.

Your request appears to allow for multiple images to be uploaded. Here :

if(file_exists($imagePath)){
    unlink($imagePath);
}

you look like you're trying to delete any images that already exist, but when you store upload images you're assigning them a random name (which Laravel can already handle for you, by the way, so there's no need to do it yourself) so you're unlikely to be actually deleting them because there'll likely be no file at that location anyway.

Nowhere does your code actually delete any existing images from the database. Essentially what you want to do is :

  1. If the upload has images, retrieve all the existing images for that product.

  2. Delete the physical files for those existing images.

  3. Delete the database entries for those existing images.

  4. Upload your new images and save their details to the database.

Translating that into code means :

if($request->hasfile('images')){
    // Delete any existing image files and database entries.
    $existingimages = Image::where('product_id', $product->id)->get();
    if($existingimages->count() > 0)
        foreach($existingimages as $existingimage) { 
            $filename = public_path().'files/'.$existingimage->name;
            unlink($filename);
            $existingimage->delete();
        }
    }
    // Carry on with your upload
}
  • Related