Удаление нескольких записей в laravel с помощью цикла foreach

#php #laravel #laravel-7

#php #laravel #laravel-7

Вопрос:

Я пытаюсь удалить несколько изображений с помощью product_id, я могу удалять по одному изображению за раз, но выясняю, как я могу вставить переменную типа $ i = 0 в цикл, но это не работает в laravel. пока это мой код

    public function ImageDelete($slider_id)
{
    //int $i=0; Had introduced this but doesn't work
    $slider = Products::findOrFail($slider_id);
       foreach($slider as $product){
          $product_images=$slider->images()->get();
           $image_path = public_path().'images2\'.$product_images[0]->filename;
           File::delete($image_path);
         //$i  ;
    }
    $slider->delete();

    return response()->json(['success'=>'Pics deleted successfully!']);
}
 

Комментарии:

1. Привет, дорогой друг. попробуйте $slider = Products::where('id',$slider_id)->get(); , если у вас есть несколько записей с одинаковым значением id .

2. @Mohammad Спасибо, что изображения находятся в папке, у одного продукта может быть несколько изображений, поэтому моя проблема заключается в удалении всех изображений этого продукта на его пути.

3. Вы пробовали foreach $product_images ? Потому что у вас есть несколько изображений для одного продукта. используйте foreach on $product_images и измените $image_path следующим образом: $image_path = public_path().'images2\'.$product_image->filename;

4. @MohammadAliyari, если я попытаюсь это сделать, я получу ошибку Undefined переменная: product_images но когда я ввожу цикл foreach и добавляю $product_images[0]->filename, это работает, но удаляет только одно изображение

Ответ №1:

findOrFail Метод возвращает только один элемент. Таким образом, вы не можете выполнить итерацию по нему.

Вы можете использовать each метод

 $product = Products::findOrFail($id);
$images = $product->images()->get();

$images->each(function ($file, $key) {
  $filePath = public_path("images2/") . $file->filename;
  File::delete($filePath);
});

// Delete the product
$product->delete();
 

Комментарии:

1. Спасибо, но как реализовать эту часть ($value, $ key)

2. Я обновил свой ответ. Пожалуйста, ознакомьтесь с документацией Laravel относительно сбора и их методов.

Ответ №2:

Попробуйте это:

    public function ImageDelete($slider_id)
{
    $product = Products::find($slider_id);

    $product_images=$product->images()->get();

       foreach($product_images as $product_image){
           $image_path = public_path().'images2\'.$product_image->filename;
           File::delete($image_path);
        }
    $product->delete();

    return response()->json(['success'=>'Pics deleted successfully!']);
}