#laravel #laravel-5 #eloquent #laravel-5.4 #php-carbon
#laravel #laravel-5 #красноречивый #laravel-5.4 #php-carbon
Вопрос:
Я использую Laravel 5.4 и Carbon, чтобы найти даты, которые ровно за один и три дня до задания laravel (с точностью до часа) для отправки уведомлений. Так, например, если дата была 2019-03-10 18:00:03
или 2019-03-10 18:15:34
, я бы хотел отправить уведомление завтра в 2019-03-07 18:00:00
и другое в 2019-03-09 18:00:00
. Я хотел бы сделать это в красноречивом запросе, но не совсем уверен, как выполнить «ленивое сопоставление» по дням и часам. Если у меня есть Appointment
модель с start_date
меткой времени, я знаю, что могу выполнить точные совпадения по дням или датам, но я хочу найти совпадения, которые не учитывают часы / секунды. Я рассматривал что-то в этом роде:
$oneDayAppointments = Appointment::whereDay(
'start_date',
Carbon::now()->addDay()->day
)->get();
…получил бы я любые встречи, где start_date — это день с этого момента. Теперь, как бы мне отточить ее до дня и часа. Если бы я просто использовал предложение where:
$oneDayAppointments = Appointment::where(
'start_date',
Carbon::now()->addHours(24)
)->get();
…Я мог бы получить точные совпадения, но только если бы минуты / секунды также совпадали. Спасибо!
Комментарии:
1. Вам нужно будет поиграть с объектом date перед выполнением запроса, чтобы получить текущую дату и время, но удалите минуты и секунды и добавьте к ним один день. Как только у вас будет эта дата, вам нужно будет создать дату-время «до», которая соответствует этой дате с точностью до часа 1 час — 1 секунда. Как только у вас есть эти два datetimes, вы используете whereBetween в запросе eloquent
Ответ №1:
Работая над моим комментарием выше, это должно сделать это
$tomorrowStart = Carbon::createFromFormat('Y-m-d H:i:s', Carbon::now()->addDay()->format('Y-m-d H:00:00'));
$tomorrowEnd = $tomorrowStart->copy()->addHour()->subSecond();
//whereBetween('start_date', [$tomorrowStart, $tomorrowEnd])
Комментарии:
1. Вы понимаете, что это делает? Кроме того, будьте осторожны, если вы используете часовые пояса в своей временной метке.
2. Да, я тоже это учел. Спасибо!
3. кроме того, добавьте индекс в ваше поле start_date — в противном случае это приведет к последовательному сканированию и будет замедляться по мере заполнения большего количества записей. Либо создайте новую миграцию, либо, если вы можете выполнить откат и начать заново, добавьте в свой исходный файл миграции для модели: $table-> timestamp(‘start_date’)->index();