Красноречивый запрос для пользователя понедельник 9 утра по часовому поясу - PullRequest
0 голосов
/ 15 мая 2019

Я активно гуглил, но не могу понять, как мне это сделать.

Если у меня есть часовой пояс для всех моих пользователей (например, 'Australia/Melbourne'), и я запускаю cron работа каждый час, есть ли способ сделать запрос для каждого пользователя, для которого в понедельник 9 утра?

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Ну, сначала вы должны получить все часовые пояса в базе данных, а затем выбрать тот, для которого это 9 часов утра:

$tzs = User::select('timezone')->distinct()->pluck('timezone');
$applicableTimezones = $tzs->filter(function ($timezone) {    
     $localTime = Carbon::now(new DateTimeZone($timezone));
     return $localTime->hour == 9 
            && $localTime->minute == 0  
            && $localTime->dayOfWeek == Carbon::MONDAY;
});

$users = User::whereIn('timezone', $applicableTimezones)->get();

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

0 голосов
/ 15 мая 2019

Как в вашей работе cron проверять время следующим образом:

$mondayMorning = Carbon\Carbon::createFromFormat('D H:i', 'Mon 09:00', 'Australia/Melbourne');

if(Carbon\Carbon::now()->eq($mondayMorning))
{
    // So here query all the users where the timezone is met. Because this condition should be 
    // satisfied only at that time.

    $users = User::where('timezone', 'Australia/Melbourne')->get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...