每个订单时间超过20分钟时更新状态

时间:2016-04-07 14:52:53

标签: php mongodb laravel lumen jenssegers-mongodb

我使用Laravel Lumen框架和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查询中存在任何订单,订单created_at是&lt; 20分钟前,状态仍在等待订单状态更新为暂停

2 个答案:

答案 0 :(得分:2)

使用 Laravel的命令日程安排相结合,您将得到您想要的内容。

以下是详细说明:

步骤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:将命令添加到Schedule

打开Kernel.php目录中的app\Console\ 您将看到一个名为$ commands的数组,将我们的类添加到其中

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

现在转到schedule方法并安排新创建的命令

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

好的,这里发生的是现在,每隔五分钟,调度程序将每五分钟执行一次ChangePendingToSuspended命令, 但是还有一步,我们需要通过将它的cron作业添加到我们的系统来制定计划。

步骤5:将计划cron条目添加到您的服务器

这在服务器和发行版之间有所不同,无论您使用的是Windows还是linux或osx

但这是cron条目

for linux:

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

for windows(使用任务调度程序):

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

答案 1 :(得分:1)

我认为你应该每分钟使用Eloquen属性而不是更新数据库。

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