'Laravel Livewire image upload verification on edit form problem

I have a product page with an image upload form built with Livewire. when i revisit the page to update information, the page will only submit if I also pass through a new image even if I update other fields. I want it to keep the current uploaded image if the image form isn't touched, allow me to update other fields without a new image upload, and upload and replace the image url when that section is updated.

I have tried all sorts of validator modifiers - nullable, sometimes, and a few if statements and i can't seem to figure it out.

Here is my upload function in my Livewire Component:

public function updateProductVariant($id)
    {
        $productVariant = ProductVariant::find($id);

        $validated = $this->validate([
            'img_url'=>'sometimes|image',
            'available_end_date'=>'required',
            'available_start_date'=>'required',
            'notes'=>'required',
        ]);

        $img_url = $productVariant->img_url;

        if($validated['img_url'] != "")
        {
            $name = $productVariant->id . '.' . $validated['img_url']->extension();
            $this->img_url->storeAs('public', $name);
            $img_url = "/storage/$name";
        }

            $categories = ['Dough', 'Merch' , 'Packaging' , 'Supplies' , 'Kits' , 
   'Featured' , 'Upcoming' , 'Clearance'];
    foreach($categories as $category) {
                if($this->$category) {
        ProductCategory::updateOrCreate(['category_name'=>$category , 'product_variant_id'=>$id],[]);
                } else {
        ProductCategory::where('category_name' , $category)->where('product_variant_id' , $id)->delete();
                }
            }
        ProductVariant::updateorCreate(
            ['id' => $id],
            [
                'img_url' => $img_url,
                'available_end_date' => $validated['available_end_date'],
                'available_start_date' => $validated['available_start_date'],
                'notes' => $validated['notes'],
            ]);
        session()->flash('message', 'Product successfully updated');
        $this->resetFields();
        $this->emit('gotoTop');
        return redirect("corporate/cookies");
    }

And my relevant blade section:

 <!--/form-group-->
                            <div class="mb-3">
                                <input class="form-control form-control-lg" type="file" id="img_url" name="img_url" wire:model="img_url">
                                    <br>

                                @if($img_url && !is_string($img_url))
                                    <div style="text-align: center;"> <img src="{{$img_url->temporaryUrl()}}" alt="" class="img-fluid rounded-3" style="max-width: 50%;"></div>
                                @endif

                                    <div style="text-align: center;"> <img src="{{ $img_url }}" alt="" class="img-fluid rounded-3" style="max-width: 50%;"></div>
                            </div>
                    <!--/extra-->
                    <br>
                    <div class="d-grid mb-">
                        <button type="submit" class="btn btn-lg btn-block btn-primary" wire:click.prevent="updateProductVariant({{$item_id}})">Update</button>
                    </div>


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source