Запрашивайте дни рождения дня с помощью Doctrine ORM

С необработанным SQL я обычно делаю следующее:

SELECT * FROM users WHERE MONTH(birthday) = 11 AND DAY(birthday) = 17.

Но эти функции MONTH() и DAY() работают не со всеми базами данных =/

Итак, как лучше всего это сделать, чтобы это работало с любой базой данных, поддерживаемой Doctrine?


person Danizord    schedule 17.05.2013    source источник


Ответы (1)


Чтобы выполнить этот расчет на уровне SQL-сервера, вам придется создать несколько пользовательских функций DQL:

http://www.doctrine-project.org/blog/doctrine2-custom-dql-udfs.html

Взгляните также на официальный документ:

http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#adding-your-self-functions-to-the-dql-language

Вот пример с функциями DISTANCE postgresql:

https://github.com/KnpLabs/DoctrineBehaviors/blob/master/src/Knp/DoctrineBehaviors/ORM/Geocodable/Query/AST/Functions/DistanceFunction.php

Вы заботитесь о том, чтобы это работало для ЛЮБОЙ поддерживаемой RDBM? Воспользуйтесь преимуществами DatabasePlatform в своем методе getSql():

<?php

public function getSql(SqlWalker $walker)
{
    $walker->getConnection()->getDatabasePlatform(); // platform specific stuff
}
person Florian Klein    schedule 17.05.2013
comment
Спасибо за ответ @Florian. Я просто не понимаю, почему в Doctrine нет стандартной функции DQL для этого, ведь все RDBM имеют поддержку такого типа функций. Я создаю модуль ZF2, чтобы абстрагироваться от этой проблемы, и я намерен в конечном итоге сделать запрос на включение Доктрина для реализации этой функции DQL. Как вы думаете? - person Danizord; 18.05.2013