Я создал приложение Laravel, в котором я использую команду, которая отправляет электронные письма каждому своему пользователю с подсчетом сообщений, полученных пользователем в его чате, уведомлениями от приложения и подписчиками, которые следили за ним за последние 24 часа (1 день)
Я пытаюсь подсчитать сообщения, уведомления и подписчиков, которые пользователь получил за последние 24 часа.
Когда я это проверяю - работает нормально. (Когда я проверяю это, я устанавливаю дату и время для планировщика на 2-3 минуты вперед и жду результата или просто запускаю команду, которая дает мне результаты непосредственно через консоль)
Проблема возникает, когда я пытаюсь получить все результаты за последние 24 часа. Заметил - вообще не работает, всегда показывает "0" в счетчиках.
Я предполагаю, что проблема где-то в форматировании даты, но не вижу в этом никаких ошибок.
Когда я тестирую, это работает, но когда я жду 24 часа - это не работает, и я должен исправить это быстрее, а не ждать днями, чтобы поймать ошибку.
Вот код планировщика:
protected function schedule(Schedule $schedule) {
$schedule->command('command:send_user_general_info_to_email')
->daily()->at('13:00')->timezone('Europe/London');
}
Вот код для подсчета сообщений, уведомлений и подписчиков за последние 24 часа:
public function handle() {
$new_messages_amount = 0;
$new_followers_amount = 0;
$new_notifications_amount = 0;
// chunk all the user in the app when send emails
User::chunk(300, function( $users ) {
foreach ($users as $user) {
$new_messages_amount = Chat::where('user_id', $user->id )
->whereDate('created_at', '>', Carbon::now()->subHours(24)->toDateTimeString() )
->where('type', 1)
->count();
$new_followers_amount = DB::table('followers')
->where('following_id', $user->id)
->whereDate('created_at', '>', Carbon::now()->subHours(24)->toDateTimeString() )
->count();
$new_notifications_amount = $user->unreadNotifications()
->whereDate('created_at', '>', Carbon::now()->subHours(24)->toDateTimeString() )
->count();
if ( $user->email ) { // if user has email not NULL
$user_info = [
'username' => $user->first_name,
'new_messages_amount' => $new_messages_amount,
'new_followers_amount' => $new_followers_amount,
'new_notifications_amount' => $new_notifications_amount,
];
Mail::to( $user->email )->queue( new DailyOverviewMail($user_info) );
}
}
// make a delay for 1 minute
sleep(60);
});
}
Ребята, заранее спасибо за любую помощь, которая может помочь мне решить проблему!
whereDate
, если вы сравниваете всю строку даты и времени. Я не играл с этими функциями, но похоже, что они предназначены для сравнения определенных частей даты, а не всего. Попытка просто использоватьwhere
. - person Matt K   schedule 04.09.2019