Как правильно составить query builder
Есть сущность User с полем registrationDate(дата регистрации). Как правильно составить query builder, чтобы получить массив пользователей, зарегистрированных в переданный день и месяц?
public function findByDayAndMonthOfRegistration(int $day, int $month)
{
return $this->createQueryBuilder('b')
->....
}
Ответы (1 шт):
Тут есть 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;
Ну и искать просто по этой колонке.