Выборка ближайших дат на Laravel

20 Марта 2023 02:26

Получаем ближайшие даты, котоыре будут. 

Это бывает необходимо, например, при написании функционала напоминаний или ближайших дней рождения и т.д.

Основное, что будет использовано:

  1. Библиотека для работы с датами Carbon. Ссылка - https://carbon.nesbot.com/docs/.
  2. Метод построителя запросов whereBetween. Ссылка - https://laravel.su/docs/8.x/queries#additional-where-clauses.

Допустим, у нас есть модель Reminds (Напоминания), в которой есть поле datetime (дата события). Нам нужно получить выборку между двумя датами - текущая дата и текущая дата + 3 дня.

Сам запрос будет выглядеть так:

$nearestReminds = Remind::whereBetween('datetime', $this->createRange())
 ->sortByDesc('datetime')
 ->values()
 ->toArray();

Примечание. Метод values() используется, чтобы сбросить ключи коллекций в выборке и чтобы на выходе был массив с данными, а не объект.

Но у нас есть метод createRagne(), который формирует нам 2 даты для метода whereBetween. Выглядит он так:

private function createRange(): array
{
    $now = (new Carbon())->now();

    $firstDate = $now->format('Y-m-d H:i:s');
    $lastDate = $now->addDays(3)->format('Y-m-d H:i:s');

    return [
        $firstDate,
        $lastDate
    ];
}

Этот метод возвращает массив вида:

[
    0 => '2023-03-19 21:36',
    1 => '2023-03-22 21:36'
]

Собственно, он и нужен для метода whereBetween.