Есть таблица заказов - orders.
Есть таблица блюд - dishes.
Есть таблица позиций в заказе - order_dishe.
Мне нужно из слушателя при изменении заказа вызывать нотификацию, но только при изменении определенных полей (не всех, иначе было бы слишком просто).
Как мне в слушателе, который прослушивает событие OrderUpdatedEvent понять, что изменились данные в сводной таблице?
// метод контроллера на добавление позиций в сводную таблицу
public function addDishes(OrderDisheRequest $request, Table $table)
{
$table->load('currentOrder');
$order = $table->currentOrder;
collect($request->get('dishes'))->each(function ($dishe) use ($order) {
repeatCallback($dishe['quantity'], function() use($order, $dishe) {
$order->dishes()->attach($dishe['id'], [
'comment' => $dishe['comment'] ?? null,
'price' => Dishe::find($dishe['id'])->price,
]);
});
});
event(new \App\Events\OrderUpdatedEvent($order));
// $order->notify(new \App\Notifications\Websocket\Admin\OrderDisheUpdateNotification());
return $this->baseJson(message: ResponseHelper::success(__('orders.messages.update.success')));
}
// listener
public function handle(OrderUpdatedEvent $event)
{
$changes = collect($event->order->getChanges());
if ($changes->has('status')) {
$this->statusChanged($event, $changes->get('status'));
}
if ($changes->hasAny(['status', 'user_id', 'table_id'])) {
# уведомление для обновления списка заказов
$event->order->project->notify(new \App\Notifications\Websocket\Admin\ProjectOrderUpdatingNotification($event->order));
}
# уведомления для обновления конкретного заказа
$event->order->notify(new \App\Notifications\Websocket\Admin\OrderUpdatingNotification());
$event->order->notify(new \App\Notifications\Websocket\Public\OrderUpdatingNotification());
}
Можно было бы разделить нотификации и не было бы проблем - сразу вызывать ее.
Но на фронте я не хочу подписываться на два разные события, которые делают одни и те же действия, т. к. позиции возвращаются в заказе, а мне нужно будет перевызвать метод получения последнего при любом изменении заказа.