Laravel Eloquent $model->getChanges() всегда пуст в обновленном событии

Я пытаюсь передать все изменения модели во внешний интерфейс, используя обновленное событие. Я не хочу отправлять всю модель, поэтому я нашел метод 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,
    ];

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
0
2 386
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Спасибо! Это работает! Единственное, порядок, в котором он выполняется, все еще не ожидается (он еще не сохранен в БД на тот момент), но теперь getDirty() возвращает то, что мне нужно.

Stepan 03.04.2019 15:36

Другие вопросы по теме