I use Laravel Lumen framework and jenssegers/laravel-mongodb package , my query in project is :
$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);
I want to any order exist in top query and in last orWehere
query , order created_at was < 20 minutes ago and status still was pending that order status updated to suspend
Use Laravel's Commands combined with schedule and you will get what you want.
Here's a detailed explanation:
Open a console then execute
php artisan make:console ChangePendingToSuspended
ChangePendingToSuspended.php
you can find it in your app/Console/Commands/
directory and tamper with it's parameters like adding a description
protected $description = 'Changes the Requests which has been in pending status for a period of time to suspended status.';
and a signature
protected $signature = 'requests:clear-pending';
Ok, before you ask "What's a signature?"
A signature is a way of executing the command from the console for example now you can manually initiate the ChangePendingToSuspended
command from artisan like
php artisan requests:clear-pending
Now you put your code into the handle
method in your case it might be something in the context of:
public function handle(){
\DB::table('requests')
->where('created_at','<',\Carbon\Carbon::now()->addMinutes(-20))
->update(['status'=>'suspended']);
}
Just use whatever method that you prefer to change the status in that command.
Open up Kernel.php
found in app\Console\
directory
you will be presented with an array called $commands, add our class to it
protected $commands = [
Commands\Inspire::class,
Commands\ChangePendingToSuspended::class,
];
Now go to the schedule method and schedule your newly created command
protected function schedule(Schedule $schedule)
{
...
$schedule->command('requests:change-pending-to-investigate')->everyFiveMinutes();
...
}
Ok what's happening here is that now, every five minutes, the scheduler will execute our command ChangePendingToSuspended
each five minutes,
but there's still 1 more step, we need to make the schedule tick by adding it's cron job to our system.
this differs among servers and releases, whether you are using windows, or linux or osx
but here's the cron entry
for linux:
* * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1
for windows (using the task scheduler):
* * * * path/to/php path/to/artisan schedule:run 1>> NUL 2>&1