Я хочу изменить значение данных, если таймер обратного отсчета прошел в Laravel 6

#php #laravel #queue

#php #laravel #очередь

Вопрос:

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

Это моя функция для вызова очереди:

 public function callqueue(Request $request)
{
    $request->validate([
        'called'  => ['max:255'],
        'counter' => ['max:255']
    ]);

    $dept = Auth::user()->department;
    $call = Queue::where([
            ['department',$dept],
            ['called', 'no']
        ])
        ->whereDate('created_at', Carbon::today())
        ->orderBy('id', 'asc')
        ->first();

    if ( ! is_null($call)) {
        $call->update([
            'called'  => $request->called,
            'counter' => $request->counter
        ]);
        $call->save();
        event(new NewQueue($call));
        return redirect('admin')->withStatus(__('Queue has been called.'));
    } else {
        return redirect('admin')->withStatus(__('No available queue for calling.'));
    }
}
  

Комментарии:

1. Вопросы: 1) какие другие методы будут иметь ваша система очередей? 2) является ли ‘callqueue’ эффективным удалением элемента из очереди? Если да, то почему мы ищем с ‘created_at’, установленным на ‘today’? 3) зачем создавать новый элемент очереди, когда мы обновляем старый элемент очереди? удаляет ли метод ::where() элемент из очереди? Трудно ответить, не понимая больше

2. функция callqueue просто обновляет значение данных очереди. Я хотел, чтобы при вызове очереди она возвращалась к последней очереди, если клиент НЕ ПОЯВЛЯЕТСЯ или не отвечает в течение 5 минут.

3. Что не работает в вашем коде? Что он должен делать, чего он не делает?

4. мой код просто вызывает очередь для системы очередей. Мне нужна функция, которая при вызове очереди будет возвращаться к последней строке очереди, если пользователь не отображается в течение 5 минут.

5. Я думаю, вам нужно обновить вопрос, чтобы предоставить гораздо больше информации, включить входные и выходные данные и, возможно, больше кода. Похоже, вам нужно реализовать концепцию транзакционности, но я даже не уверен. Подойдет ли реализованная в библиотеке транзакционность? Пожалуйста, разверните свой вопрос, я думаю, что на данный момент на него невозможно ответить. Вы должны быть в состоянии указать на конкретную проблему с вашей попыткой и спросить: «Почему это не работает?» или «Я вижу «x», но я бы ожидал «y»? На данный момент неясно, была ли предпринята попытка. Извините, но это только мое честное мнение

Ответ №1:

Я создал аналогичную систему очередей, прокомментируйте, если вам нужны какие-либо изменения

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

В таблице очередей поместите 2 метки last_updated_at времени и next_update_at

Выберите первый в очереди порядок по nexy_update_at

 $call=Queue::...
    ->where('next_update_at', '>', Carbon::now()->timestamp) # I recommend to use timestamp not datetime
    ->orderBy('next_update_at', 'asc')
    ->first();

if ($call) {
// do the task
}
  

Теперь всякий раз, когда пользователь появляется на веб-сайте или на чем угодно, просто выберите его задачу в очереди и обновите next_update_at

 Queue::where('user_id', ...)
    ->...
    ->update(['next_update_at', now()->timestamp]);