Обновление статуса, когда время каждого заказа превышает 20 минут

Я использую Laravel Lumen framework и пакет jenssegers / laravel-mongodb, мой запрос в проекте:

    $time_5_min_ago = Carbon::now()->subMinute(5);
$time_10_min_ago = Carbon::now()->subMinute(10);
$time_15_min_ago = Carbon::now()->subMinute(15);
$time_20_min_ago = Carbon::now()->subMinute(20);return Order::where(function ($query)  use ($maxLat_try_one,$minLat_try_one,$maxLon_try_one,$minLon_try_one,$time_5_min_ago,$time_10_min_ago) {
$query->whereBetween('source_longitude', [$minLon_try_one, $maxLon_try_one])
->whereBetween('source_latitude', [$minLat_try_one,$maxLat_try_one])
->where('status', '=', 'pending')
->where('created_at', '<', $time_5_min_ago)
->where('created_at', '>=', $time_10_min_ago);
})->orWhere(function ($query)  use ($maxLat_try_two,$minLat_try_two,$maxLon_try_two,$minLon_try_two,$time_10_min_ago,$time_15_min_ago) {
$query->whereBetween('source_longitude', [$minLon_try_two, $maxLon_try_two])
->whereBetween('source_latitude', [$minLat_try_two,$maxLat_try_two])
->where('status', '=', 'pending')
->where('created_at', '<', $time_10_min_ago)
->where('created_at', '>=', $time_15_min_ago);
})->orWhere(function ($query)  use ($maxLat_try_three,$minLat_try_three,$maxLon_try_three,$minLon_try_three,$time_15_min_ago,$time_20_min_ago) {
$query->whereBetween('source_longitude', [$minLon_try_three, $maxLon_try_three])
->whereBetween('source_latitude', [$minLat_try_three,$maxLat_try_three])
->where('status', '=', 'pending')
->where('created_at', '<', $time_15_min_ago)
->where('created_at', '>=', $time_20_min_ago);
})->get($fields);

Я хочу, чтобы любой заказ существовал в верхнем запросе и в последнем orWehere запрос, созданный заказ был < 20 минут назад и статус еще не завершен, статус заказа обновлен для приостановки

0

Решение

использование Команды Ларавела в сочетании с график и вы получите то, что вы хотите.

Вот подробное объяснение:

Шаг 1. Создайте команду под названием «ChangePendingToSuspended»

Откройте консоль и выполните

php artisan make:console ChangePendingToSuspended

Шаг 2: Откройте ChangePendingToSuspended.php

вы можете найти его в своем app/Console/Commands/ каталог и вмешиваться с его параметрами, такими как добавление описание

protected $description = 'Changes the Requests which has been in pending status for a period of time to suspended status.';

и подпись

protected $signature = 'requests:clear-pending';

Хорошо, прежде чем спросить «Что такое подпись?» Подпись — это способ выполнения команды из консоли, например, теперь вы можете вручную запустить команду ChangePendingToSuspended команда от ремесленника, как

php artisan requests:clear-pending

Шаг 3: Определение нашей команды

Теперь вы положили свой код в handle Метод в вашем случае это может быть что-то в контексте:

public function handle(){
\DB::table('requests')
->where('created_at','<',\Carbon\Carbon::now()->addMinutes(-20))
->update(['status'=>'suspended']);
}

Просто используйте любой метод, который вы предпочитаете, чтобы изменить статус в этой команде.

Шаг 4: Добавление команды в расписание

Открыть Kernel.php нашел в app\Console\ каталог
вам будет представлен массив с именем $ commands, добавьте в него наш класс

 protected $commands = [
Commands\Inspire::class,
Commands\ChangePendingToSuspended::class,
];

Теперь перейдите к методу расписания и запланируйте вновь созданную команду

protected function schedule(Schedule $schedule)
{
...
$schedule->command('requests:change-pending-to-investigate')->everyFiveMinutes();
...
}

Хорошо, что здесь происходит, это то, что теперь, каждые пять минут, планировщик будет выполнять нашу команду ChangePendingToSuspended каждые пять минут,
но есть еще 1 шаг, нам нужно сделать расписание, добавив его cron в нашу систему.

Шаг 5: добавьте запись cron расписания на ваш сервер

это отличается между серверами и выпусками, используете ли вы windows, или linux или osx

но вот запись cron

для Linux:

* * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1

для окон (с помощью планировщика задач):

* * * * path/to/php path/to/artisan schedule:run 1>> NUL 2>&1
2

Другие решения

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

public function getStatusAttribute() {
if($this->created > ....) {
$status = "pending";
} else if(...) {
....
}
return $status;
}
1

По вопросам рекламы [email protected]