Laravel переопределить delete (), когда InIn не работает - PullRequest
0 голосов
/ 21 января 2020

Я создаю приложение, которое может (мягко) удалить сообщение. Это приведет к удалению записи в базе данных и удалению файла изображения в хранилище. Я попытался создать метод переопределения для delete() в моей модели, и он выглядит так:

public function delete()
{
    $tempImage = $this->image;

    parent::delete();

    $this->imageDelete($tempImage);
}

public function imageDelete($image)
{
    $this->image = null;
    $this->save();

    if (! empty($image)) {
        unlink(public_path() . self::$pathImage . $image);
        unlink(public_path() . self::$pathThumb . $image);
    }
}

. Он работает для удаления одной записи. Но когда я пытаюсь удалить несколько записей (используя whereIn), метод переопределения недоступен, а whereIn обращается к реальному методу delete().

Это мой контроллер для удаления сообщений

public function delete(Request $r)
{
    Message::findOrFail($r->id)->delete();

    return redirect()->back();
}

public function multipleDelete(Request $r)
{
    Message::whereIn('id', $r->select)->delete();

    return redirect()->back();
}

Если я удаляю записи с помощью multipleDelete(), удаляются только записи в базе данных.

1 Ответ

1 голос
/ 21 января 2020

То, что delete(), что вы переопределяете, на самом деле - удаление модели Eloquent. Однако, когда вы пытались удалить сразу после whereIn(), это запрос БД. Так что это не будет go через вашу модель вообще. Для удаления данных используется raw sql.

Что вы можете сделать - это сначала получить результат как модель Eloquent, а затем l oop для удаления.

Message::whereIn('id', $r->select)->get()->each(function($msg) {
    $msg->delete();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...