@lexstile

Можно ли как-то объединить события на изменения заказа и позиций в сводной таблице?

Есть таблица заказов - 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());
    }


Можно было бы разделить нотификации и не было бы проблем - сразу вызывать ее.
Но на фронте я не хочу подписываться на два разные события, которые делают одни и те же действия, т. к. позиции возвращаются в заказе, а мне нужно будет перевызвать метод получения последнего при любом изменении заказа.
  • Вопрос задан
  • 57 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы