Удаление комментария и связанных изображений

Я пытаюсь удалить комментарии отдельных пользователей и связанные с ними изображения, удалив их как из записей базы данных, так и из хранилища. К сожалению, я продолжаю получать ошибки. Ниже приведен код, который у меня есть до сих пор.

Таблицы: Комментарии: id, comment, user_id, person_id изображения: id, image, comment_id, user_id, person_id

Отношения: Комментарий:

public function pictures()
{
    return $this->hasMany('App\Picture', 'comments_id', 'id');
} 

картинки:

   public function comments()
    {
        return $this->belongsTo('App\Comment', 'comments_id');
    }

Контроллер:

public function destroy($id)
{
    $comment = Comment::find($id);
    Storage::delete($comment->pictures());

    $comment->delete();
    Session::flash('success', 'Your comment and pictures were deleted');

    return redirect()->route('home');
} 

Любые идеи?


person detinu20    schedule 29.01.2018    source источник
comment
в чем ошибка??   -  person Sohel0415    schedule 29.01.2018
comment
что он не удаляет ни комментарий, ни связанные изображения.   -  person detinu20    schedule 29.01.2018


Ответы (3)


Вам нужно использовать pluck() для загрузки имен файлов изображений:

$files = $comment->pictures()->pluck('filename');

Затем удалите эти файлы:

foreach ($files as $file) {
    Storage::delete(storage_path('images/' . $file));
}

Это просто пример, вам нужно поставить правильное имя столбца вместо filename и построить правильный путь к изображениям.

Чтобы удалить изображения из БД:

$comment->images()->delete();
person Alexey Mezenin    schedule 29.01.2018

$comment->pictures() возвращает определение отношения, а не связанные изображения. если вы хотите удалить все изображения, вам нужно перебрать их и удалить одно за другим:

$comment = Comment::find($id);
foreach ($comment->pictures as $picture) {
  // delete picture from storage
  Storage::delete($picture->id); //or whatever field is used as key in the storage
  // delete picture from the database - might be optional if you've set a cascade on delete behaviour in your foreign key definition
  $picture->delete();
}
person jedrzej.kurylo    schedule 29.01.2018

Вам нужно предоставить filename изображения, чтобы удалить изображение из storage.

$comment = Comment::find($id);
foreach($comment->pictures as $picture)
        Storage::delete($picture->image);

Picture::where('comment_id',$comment->id)->delete();
$comment->delete();
person Sohel0415    schedule 29.01.2018