Модель наблюдателей: восстановлено () и восстановлено () - PullRequest
0 голосов
/ 09 октября 2019

Я хочу восстановить комментарии, прикрепленные к сообщению после сообщение восстановлено.

Это не удалось:

public function restored(Post $post)
{
    $post->comments()
        ->onlyTrashed()->where('deleted_at', '>=', $post->deleted_at)
        ->get()
        ->each(function ($comment) {
            $comment->restore();
        });
}

Это работает:

public function restoring(Post $post)
{
    $post->comments()
        ->onlyTrashed()->where('deleted_at', '>=', $post->deleted_at)
        ->get()
        ->each(function ($comment) {
            $comment->restore();
        });
}

Разница: restoring() вместо restored().

Следующее условие: where('deleted_at', '>=', $post->deleted_at) здесь, потому что я не хочу восстанавливать комментарии, которые были удалены софтпрежде чем пост был удален. Другими словами, я не хочу восстанавливать комментарии, которые были удалены софт модераторами. Я хочу восстановить комментарии, которые были мягко удалены, в тот самый момент, когда я мягко удалил сообщение.

Причина, по которой это не удалось: я считаю, что это не удается с restored(), потому что $post->deleted_at становится null, поэтому ябольше не могу использовать его в моем состоянии where(...).

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

Я также попробовал следующее:

public function restoring(Post $post)
{
    $this->deleted_at = $post->deleted_at;
}

мышлениеэто позволило бы мне «сохранить» значение $post->deleted_at и использовать его в моем методе restored(). Но нет.

Я заметил restored() восстанавливает только первый комментарий. Это как если бы комментарий был восстановлен внутри своего рода цикла, тогда $post->deleted_at, потому что null (очевидно, потому что это restored, а не restoring), поэтому он не может продолжить восстановление других комментариев в Коллекции. Я думаю, что это выдает ошибку, потому что я предполагаю, что цикл затем пытается сделать что-то вроде where('deleted_at', '>=', null) (обратите внимание на `` `null``) '. Конечно же, это работает:

public function restored(Post $post)
{
    $post->comments()
        ->onlyTrashed()
        ->get()
        ->each(function ($comment) {
            $comment->restore();
        });
}

(обратите внимание, это restored(), но мне пришлось избавиться от моего where(...), но мне действительно нужно это where(...) условие).

В основном и TL; DR : как я могу получить «старое» значение $post->deleted_at (значение непосредственно перед его восстановлением), в моем public function restoring(Post $post) { }

1 Ответ

0 голосов
/ 09 октября 2019

Я не уверен, что это идеальный метод, но, похоже, он работает в некоторых быстрых тестах. Вы также можете настроить методы получения и установки в своей модели Post, если вы предпочитаете взаимодействовать со свойством таким образом.

Post.php

class Post extends Model
{
    // add a custom property with a unique name
    // this will prevent the data from being assigned as an attribute
    public $temp_deleted_at;

    // ...
}

PostObserver.php

public function restoring(Post $post)
{
    // store to custom property
    $post->temp_deleted_at = $post->deleted_at;
}

public function restored(Post $post)
{
    // retrieve from custom property for query
    $post->comments()
        ->onlyTrashed()->where('deleted_at', '>=', $post->temp_deleted_at)
        ->get()
        ->each(function ($comment) {
            $comment->restore();
        });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...