Как правильно составить query builder

Есть сущность User с полем registrationDate(дата регистрации). Как правильно составить query builder, чтобы получить массив пользователей, зарегистрированных в переданный день и месяц?

public function findByDayAndMonthOfRegistration(int $day, int $month)
{
    return $this->createQueryBuilder('b')
        ->....
}

Ответы (1 шт):

Автор решения: Vasia Dunaev

Тут есть 2 варианта.

Зависит от версии вашей ОРМ

->andWhere('MONTH(b.registrationDate) = :month')
->andWhere('DAY(b.registrationDate) = :day')

Если докторина будет ругаться, то можно посмотреть как решить эту проблему вот тут - https://stackoverflow.com/questions/18826836/how-can-i-use-sqls-year-month-and-day-in-doctrine2 (добавив поддержку функций)

Если версия ОРМ совсем старая и обновляться нельзя, то как лайфхак можно вот так

->where('SUBSTRING(b.registrationDate, -5) = :registrationDate')
->setParameter('registrationDate', $d->format('m-d'))

Если пользователей очень много. И вам важна скорость запроса. То можно создать виртуальную колонку месяц и день, сделать индекс по ним.

ALTER TABLE b ADD registrationMonth int(8) GENERATED ALWAYS AS (MONTH(b.registrationDate)) VIRTUAL NOT NULL;

Ну и искать просто по этой колонке.

→ Ссылка