одиночное редактирование картинок в админке

Возникла трудность в получении картинок и их дальнейшем редактировании в базе. Опишу весь процес: в методе Findforedit контролера я получаю данные про товар, которые хочу отредактировать. Вот тут возникает проблема. Мне нужно заполнить 2 поля Input: 1 поле - новые данные, 2 поле скрытое - старые данные, для того что бы понимать что редактировать. Но я не знаю как заполнить поля галереи таким методом, что бы я мог обратится к ним отдельно, и поменял только то, что поменял юзер. После того как мне приходит новый запрос с отредактироваными данными во-первых, я не могу к ним обратится, во-вторых, провалидировать. Вот мой метод Findforedit:

 public function findforedit($slug)
    {
        $product = Product::with('brand', 'category', 'galleryPhotos')->whereSlug($slug)->first();
        $brands = Brand::all();
        $categories = Category::all();


        if ($product) {
            return view('adminproduct::adminproductedit', compact('product', 'brands', 'categories'));
        } else {
            return back()
                ->withErrors('Такого продукта нету')
                ->withInput();
        }
    }

вот моя в'юха:

 <div class="row" id="gallery_row">
                    @foreach($product->galleryPhotos as $photo)
                    <div class="col-md-3 mb-3" >
                    <img src="{{asset($photo->image)}}" alt="стара фотографія" id="gallery_photo">
                    <p><input type="file" name="{{$photo->name}}" id="photo_input"></p>
                        <input type="hidden" value="{{$photo->image}}" name="{{$photo->name}}">
                    </div>
                    @endforeach
                </div>

это мой метод edit, где происходит все действия, отвечающие за редактирование

public function edit(Request $request, $slug)
    {


        if ($request->visibility == null) {
            $request->visibility = 0;
        }

        if ($request->hit == null) {
            $request->hit = 0;
        }

        $validator = Validator::make($request->all(), [

            'hidden_name' => 'required|min:2|max:255|exists:products,name',
            'name' => 'required|min:2|max:255' , ['unique:products,name', Rule::unique('products', 'name')->ignore($request->hidden_name)],
            'desc' => 'required|min:2|max:255',
            'category_id' => 'required|exists:categories,id',
            'brand_id' => 'required|exists:brands,id',
            'price' => 'required|integer|min:0',
            'hidden_file' => 'required|image|exists:products,file',
            'file' => 'required|image', ['unique:products,file', Rule::unique('products', 'file')->ignore($request->hidden_file)],
            'hit' => 'nullable|in:0,1',
            'visibility' => 'nullable|in:0,1',

        ],
            [
                'name.required' => 'Потрібно вказати назву товару',
                'name.min:2' => "Замало символів",
                'name.max:255' => "Забагато символів",
                'name.unique:products,name' => "Такий товар уже є",

                'hidden_name.required' => 'Потрібно вказати назву товару',
                'hidden_name.min:2' => "Замало символів",
                'hidden_name.max:255' => "Забагато символів",
                'hidden_name.exists:products,name' => "Такий товар уже є",

                'desc.required' => "Потрібно вказати опис товару",
                'desc.min:2' => "Замало символів",
                'desc.max:255' => "Забагато символів",

                'category_id.required' => 'Потрібно вказати категорію товару',
                'category_id.exists:categories,id' => 'Не обманиш, хитрий юзер, треба вказати категорію з перечислених',

                'brand_id.required' => 'Потрібно вказати бренд товару',
                'brand_id.exists:brands,id' => 'Потрібно вказати бренд товару з перечислених',

                'price.required' => 'Потрібно вказати ціну товару',
                'price.integer' => 'Потрібно вказати ціну товару числом',
                'price.min:0' => 'Потрібно вказати додатню ціну товару',

                'file.required' => "Обов'язково потрібно завантажити картинку",
                'file.image' => "Обов'язково потрібно завантажити саме картинку",
                'file.unique:brands,file' => "Така картинка уже є",

                'hit.nullable' => "Це не nullable",
                'hit.in:0,1' => "Треба вибрати або так, або ні",

                'visibility.nullable' => "Це не nullable",
                'visibility.in:0,1' => "Треба вибрати або так, або ні",
            ]);

        if ($validator->fails()) {
            return back()
                ->withErrors($validator->getMessageBag()->first())
                ->withInput();
        }
        dd('ok');
        $strslug = Str::slug($request->name);

        $product = Product::whereSlug($slug)->first();
        app(Filesystem::class)->delete(public_path($product->file));

        Product::updateOrInsert([
            'slug' => $slug,
        ], [
                'name' => $request->desc,
                'desc' => $request->desc,
                'slug' => $strslug,
                'category_id' => $request->category_id,
                'brand_id' => $request->brand_id,
                'price' => $request->price,
                'file' => Storage::disk('publicImages')->put('img/products', $request->file),
                'hit' => $request->hit,
                'visibility' => $request->visibility,
            ]
        );


        return redirect()
            ->route('adminproduct')
            ->with(['success' => 'Успішно відредаговано']);

    }

К сожелению, JS- ом не владею, так что если можна, рассказать варианты решения моей проблемы используя только Laravel. Заранее спасибо!


Ответы (1 шт):

Автор решения: Кирилл

Я бы сделал так - выводим у каждой картинки чекбокс:

Удалить <input type="checkbox" name="delete_file_ids[]" value="{{ $file->id }}"/>.

А в самом конце инпут для добавления новых картинок:

<input type="file" multiple="multiple" name="new_files"/>.

Соотвественно в контроллере:

if ($request->isMethod('POST')) {
  foreach ($request->file('new_files') as $newFile) {
    // save $newFile
  }
  foreach ($request->get('delete_file_ids') as $deleteFileId) {
    // delete file by $deleteFileId
  }
}
→ Ссылка