Laravel Eloquent: получите записи по дням и месяцам - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь получить записи, чей день рождения today, today + 1, today + 2.

Предположим, кто-то родился 16-05-1991. Я должен найти записи, чей день рождения сегодня, завтра и послезавтра

$todayDate = date('Y-m-d');
$toDate1 = date('Y-m-d', strtotime($todayDate . ' + 1 days'));
$toDate2 = date('Y-m-d', strtotime($todayDate . ' + 2 days'));

Я пытался использовать orWhereDay, orWhereMonth, но это не имеет смысла.

Редактировать: я так и сделал, но я ищу более эффективный способ сделать это. https://pastebin.com/GRdRH2jC

Ответы [ 4 ]

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

Вы можете использовать углерод. Пример:

User::whereBetween('birthday', [Carbon::today(), Carbon::today()->addDays(1)]);

Если вы хотите использовать или, вам нужно сгруппировать их следующим образом:

User::where(function($query) {
    $query->whereDate('birthday', Carbon::today())
        ->orWhereBetween('birthday', [Carbon::today(), Carbon::today()->addDays(1)])
        ->orWhereBetween('birthday', [Carbon::today(), Carbon::today()->addDays(2)])
    })->get();
0 голосов
/ 16 мая 2019

Правильный код, кажется,

 $date = new DateTime;
 $date2 = $date->modify('+1 day');
 $date3 = $date->modify('+2 day');
 $formatted_date = $date->format('Y-m-d H:i:s');
 $formatted_date2 = $date2->format('Y-m-d H:i:s');
 $formatted_date3 = $date3->format('Y-m-d H:i:s');

Тинкер выход

>>> $date = new DateTime;
=> DateTime @1558028326 {#3144
     date: 2019-05-16 17:38:46.169709 UTC (+00:00),
   }
>>> $date2 = $date->modify('+1 day');
=> DateTime @1558114726 {#3144
     date: 2019-05-17 17:38:46.169709 UTC (+00:00),
   }
>>> $date3 = $date->modify('+2 day');
=> DateTime @1558287526 {#3144
     date: 2019-05-19 17:38:46.169709 UTC (+00:00),
   }
>>> $formatted_date = $date->format('Y-m-d H:i:s');
=> "2019-05-19 17:38:46"
>>> $formatted_date2 = $date2->format('Y-m-d H:i:s');
=> "2019-05-19 17:38:46"
>>> $formatted_date3 = $date3->format('Y-m-d H:i:s');
=> "2019-05-19 17:38:46"
>>>

Использование углерода

>>> $today = Carbon\Carbon::now()
=> Carbon\Carbon @1558072952 {#3119
     date: 2019-05-17 06:02:32.343195 UTC (+00:00),
   }
>>> $date2 = $today->addDay();
=> Carbon\Carbon @1558159352 {#3119
     date: 2019-05-18 06:02:32.343195 UTC (+00:00),
   }
>>> $date3 = $today->addDays(2);
=> Carbon\Carbon @1558332152 {#3119
     date: 2019-05-20 06:02:32.343195 UTC (+00:00),
   }
>>>
0 голосов
/ 16 мая 2019
$upcomingBdays = model::select('id', ... , 'birthday')->get()->filter(function ($model) {
    // get the bday and change the year to this year so we can simply compare dates
    $bday = Carbon::parse($model->birthday)->year(today()->year); // you can skip parsing if you have the field in the protected $dates on model
    return $bday->between(today(), today()->addDays(2));
});

Без дополнительной информации о запрашиваемой модели вы получите то, что вам нужно.

Убедитесь, что у вас также есть поле дня рождения для модели, добавленной в Массив protected $dates []; на самой модели, поэтому он автоматически анализируется по Carbon.

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

Вы можете использовать класс Carbon для времени, что немного упрощает

Use Carbon/Carbon

$today = Carbon::now()->today();
$toDate1 = Carbon::now()->today()->addDays(1);
$todate2 = Carbon::now()->today()->addDays(2);
$todate2 = Carbon::now()->today()->addDays(3);

where('birthday, '>', $today)->where('birthday', '<', $toDate1); //today
where('birthday, '>', $toDate1)->where('birthday', '<', $toDate2); //today + 1
where('birthday, '>', $toDate2)->where('birthday', '<', $toDate3); //today + 2

, если вы хотите просто месяц и день, вы можете сделать это следующим образом

 $today = Carbon::now()->today()->format('m-d');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...