Laravel Eloquent $ model-> getChanges () всегда пуст в обновленном событии - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь перенести все изменения модели во внешний интерфейс, используя обновленное событие.Я не хочу отправлять всю модель, поэтому я нашел метод hasChanges().Но он всегда пуст.

Сначала я подумал, что это событие запускается ДО фактического сохранения, но getDirty() также пусто.Затем в панели отладки я подумал, что по какой-то причине он снова получает модель (выбирая из БД) сразу после ее обновления.Это нормальное поведение или это просто создание нового объекта модели и не передача существующего в событие?

Событие:

class IcUpdated implements ShouldBroadcastNow
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    private $ic;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($ic)
    {

        $this->ic = $ic;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return [
            new Channel('dashboard_' . ConfigHelper::getSelectedOrganizationId())
        ];
    }

    public function broadcastAs()
    {
        return 'ic.updated';
    }

    public function broadcastWith()
    {
        return $this->ic->getChanges();
    }
}

Модель:

    protected $dispatchesEvents = [
        'updated' => \App\Events\IcUpdated::class,
    ];

Так как мне получить доступ и отправить только измененные поля в событии?

1 Ответ

1 голос
/ 03 апреля 2019

Это вызвано чертой SerializesModels. Это приводит к тому, что модель сериализуется в ее первичный ключ, а затем повторно выбирается из базы данных при выполнении задания.

Это полезно в тех случаях, когда задание в очереди задерживается, например, вы помещаете в очередь сообщение электронной почты, чтобы перейти к $ user. Пользователь меняет свой адрес электронной почты, задание в очереди выполняется, но выходит на новый адрес электронной почты, так как он получает пользователя из базы данных.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...