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






Это вызвано чертой SerializesModels. Это приводит к сериализации модели в ее первичный ключ, а затем повторной выборке из базы данных при выполнении задания.
Это полезно в тех случаях, когда есть задержка в задании в очереди, например, вы ставите электронное письмо в очередь для отправки пользователю $user. Пользователь меняет свой адрес электронной почты, задание в очереди запускается, но отправляется на новый адрес электронной почты, поскольку оно повторно извлекает пользователя из базы данных.
В вашем случае вы определенно не хотите сериализовать модель по ее ключу, поскольку вам нужны свойства, хранящиеся в этом конкретном экземпляре модели.
Спасибо! Это работает! Единственное, порядок, в котором он выполняется, все еще не ожидается (он еще не сохранен в БД на тот момент), но теперь
getDirty()возвращает то, что мне нужно.