Search code examples
phplaravellaravel-9

Skip image validation and creation in laravel update function


Please am trying to upload 3 different images using the code below. How do I get each of the methods that generates the unique image names to run only when their respective request fields have data or is not empty. thus the form submit should not try generating any image name for afile field when that particular file field is empty.

My update controller function

public function update(Request $request, Product $product)
{
    $image = $request->file('primary_image');
    $name_gen = md5(rand(1000, 10000)).'.'.$image->getClientOriginalExtension();  

    Image::make($image)->resize(523,605)->save('upload/products/'.$name_gen);
    $save_url = 'upload/products/'.$name_gen;


$image_1 = $request->file('image_1');
$name_gen = md5(rand(1000, 10000)).'.'.$image_1->getClientOriginalExtension();  

Image::make($image_1)->resize(523,605)->save('upload/products/'.$name_gen);
$save_url_1 = 'upload/products/'.$name_gen;



$image_2 = $request->file('image_2');
    $name_gen = md5(rand(1000, 10000)).'.'.$image_2->getClientOriginalExtension();  

    Image::make($image_2)->resize(523,605)->save('upload/products/'.$name_gen);
    $save_url_2 = 'upload/products/'.$name_gen;


    Product::insert([
        'name' => $request->name,
        'category' => $request->category,
        'price' => $request->price,
        'description' => $request->description,
        'status' => $request -> status,
        'estimated_delivery_time' => $request->estimated_delivery_time,
        'available_quantity' => $request->available_quantity,
        'colors' => $request->colors,
        'supplier_name' => $request->supplier_name,
        'supplier_phone' => $request->supplier_phone,
        'video_description' => $request->video_description,
        'primary_image' => $save_url,
        'image_1' => $save_url_1,
        'image_2' => $save_url_2,


    ]);


    $notification = array(
    'message' => 'Product updated successfully',
    'alert-type' => 'success'
);

return redirect()->back()->with($notification);

}

Thanks so much for taking time to review my code


Solution

  • Since you are doing the same name generation process all through, you can use an array and do a foreach loop with an if condition like this:

    $my_array = [$request->file('primary_image'), $request->file('image_1'), $request->file('image_2')];
    
    foreach($my_array as $item) {
    if($item) {
    $image = $item;
        $name_gen = md5(rand(1000, 10000)).'.'.$image->getClientOriginalExtension();  
    
        Image::make($image)->resize(523,605)->save('upload/products/'.$name_gen);
        $save_url = 'upload/products/'.$name_gen;
    
    }
    
    }
    

    Now this will only generate names for images that are not empty.

    UPDATE: For the insert functionality, I would assume your table fields for the images can have null values, so this doesn't throw an error. Now instead of the code above, do this:

    $my_array = [$request->file('primary_image'), $request->file('image_1'), $request->file('image_2')];
    $insert_array = [];
    foreach($my_array as $item) {
    $save_url = '';
    if($item) {
    $image = $item;
        $name_gen = md5(rand(1000, 10000)).'.'.$image->getClientOriginalExtension();  
    
        Image::make($image)->resize(523,605)->save('upload/products/'.$name_gen);
        $save_url = 'upload/products/'.$name_gen;
        
    
    }
    array_push($insert_array, $save_url);
    
    }
    

    Now for your insert query, do this:

    Product::insert([
            'name' => $request->name,
            'category' => $request->category,
            'price' => $request->price,
            'description' => $request->description,
            'status' => $request -> status,
            'estimated_delivery_time' => $request->estimated_delivery_time,
            'available_quantity' => $request->available_quantity,
            'colors' => $request->colors,
            'supplier_name' => $request->supplier_name,
            'supplier_phone' => $request->supplier_phone,
            'video_description' => $request->video_description,
            'primary_image' => $insert_array[0],
            'image_1' => $insert_array[1],
            'image_2' => $insert_array[2],
    
    
        ]);
    

    This would work.