#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]);