restore() выдает исключение InvalidArgumentException

Это отлично работает:

$post->comments()->withTrashed()->get()->each->delete();

Поскольку он действительно удаляет 6 строк, each возвращает как коллекцию.

Однако это вызывает исключение:

$post->comments()->withTrashed()->get()->each->restore();

Я заметил, что он также восстановил 1 строку (первую строку) в базе данных (в коллекции 6 строк).

Контекст: я использую такой код в Observer для восстановления комментариев при восстановлении сообщения.

Следующее вызовет точно такое же исключение InvalidArgumentException with message 'Illegale operator and value combination.' :

$post->comments()->withTrashed()->where('deleted_at', '>=', $post->deleted_at)->get()->each->restore();

Условие where() позволяет мне восстанавливать только мягко удаленные комментарии вместе с программным удалением сообщения (чтобы оно также не восстанавливало комментарии, удаленные модераторами до удаления всего сообщения).


person Musa    schedule 08.10.2019    source источник
comment
Похоже, вы можете столкнуться с этой ошибкой является соответствующим $value нулевым. Условие, при котором может вылететь ошибка.   -  person adam    schedule 08.10.2019
comment
Я определил ошибку. Наблюдатель срабатывает по событию модели restored() Post. Таким образом, атрибут $post->deleted_at имеет значение null после первой итерации (что объясняет, почему он обновил только первую строку базы данных, а затем выдал исключение, поскольку затем он выполняет >= при нулевом значении. Мне удалось быстро исправить изменение restored() на restoring(), но я не доволен этим. Я хочу восстановить комментарии после восстановления поста, а не раньше.   -  person Musa    schedule 08.10.2019


Ответы (2)


$post->comments()->onlyTrashed()->get()->each->restore();

Не знаю, поможет ли это, но вы можете попробовать это. Поскольку восстановление может работать только с отправленными в корзину сообщениями, возможно, это и является причиной проблемы.

person Gerald Ibra    schedule 08.10.2019
comment
Также я не думаю, что вам нужно withTrashed() при удалении. Потому что удаленный комментарий не может быть отправлен в корзину дважды. Я уверен, что если вы запустите это дважды, это откроет проблему, подобную восстановлению. просто сделать - person Gerald Ibra; 08.10.2019
comment
$post-›comments()-›get()-›each-›delete(); - person Gerald Ibra; 08.10.2019

        $post->comments()
            ->onlyTrashed()->where('deleted_at', '>=', $post->deleted_at)
            ->get()
            ->each->restore();

Это действительно работает. Проблема заключалась в том, что мой Observer срабатывает в restored, из-за чего $post->deleted_at становится null сразу после первой итерации. Проблема была исправлена ​​с использованием события модели restoring() вместо restored().

Это (выше) отвечает на мой первоначальный вопрос.

Я еще не придумал, как продолжать использовать restored (я хочу, чтобы комментарии восстанавливались после восстановления поста), поскольку restored превращает $post->deleted_at в null, таким образом, недопустимое в моем условии where(). Мне нужно найти способ сохранить исходное значение $post->deleted_at при использовании restored(). getDirty() и getChanges() не помогли. Я приму свой ответ через 3 дня, если кто-то не поделится способом сохранить событие restored. Я полагаю, что это все равно выходит за рамки первоначального вопроса?

person Musa    schedule 08.10.2019