Как я могу использовать DATE () в Doctrine 2 DQL?

В Symfony, когда я использовал следующий запрос с функцией DATE в MySQL, я получаю ошибку

    SELECT employer.companyName AS employerName, jobs.jobId, jobs.industryId,
jobs.focusId, jobs.companyName, jobs.employerId, jobs.jobTitle, DATE(jobs.createdDate) AS
createdDate , DATE(jobs.endDate) AS endDate , jobs.replyTo, jobs.featured , jobs.jobType,
jobs.status  FROM Acme\\AppsBundle\\Entity\\Jobs jobs , Acme\\AppsBundle\\Entity\\Employer
employer  WHERE  jobs.employerId = employer.employerId  GROUP BY  jobs.jobId  ORDER BY
jobs.jobId DESC

Почему это так и какой обходной путь существует, чтобы преодолеть эту ситуацию, в базе данных эти поля, т.е. end_date, хранятся в виде mysql типа «date»

    [2014-09-17 05:52:42] request.CRITICAL: Uncaught PHP Exception Doctrine\ORM\Query
\QueryException: "[Syntax Error] line 0, col 138: Error: Expected known function, got
'DATE'" at /.../Doctrine/ORM/Query/QueryException.php line 52 {"exception":"[object]
(Doctrine\\ORM\\Query\\QueryException: [Syntax Error] line 0, col 138: Error: Expected known function, got 'DATE' at /var/w.../doctrine/orm/lib/Doctrine/ORM/Query
/QueryException.php:52, Doctrine\\ORM\\Query\\QueryException: SELECT employer.companyName
AS employerName, jobs.jobId, jobs.industryId, jobs.focusId, jobs.companyName, jobs.employerId, jobs.jobTitle, DATE(jobs.createdDate) AS createdDate , DATE(jobs.endDate)
AS endDate , jobs.replyTo, jobs.featured , jobs.jobType, jobs.status  FROM Acme\\AppsBundle
\\Entity\\Jobs jobs , Acme\\AppsBundle\\Entity\\Employer employer  WHERE  jobs.employerId
= employer.employerId  GROUP BY  jobs.jobId  ORDER BY  jobs.jobId DESC  at /var/w...
/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:41)"} []

4

Решение

DQL знает только несколько стандартных функций sql (coalesce например). Чтобы иметь возможность использовать свою пользовательскую функцию, вам нужно зарегистрировать ее и сообщить doctrine как перевести его в raw sql. Следуйте этим инструкциям:

Symfony Doc

Доктрина Док

И проверь мой ответ Вот

8

Другие решения

В дополнение к принятому ответу на сайте доступно множество готовых пользовательских функций. https://github.com/beberlei/DoctrineExtensions .

Затем они могут быть зарегистрированы в вашей конфигурации, как

doctrine:
orm:
dql:
string_functions:
DATE: DoctrineExtensions\Query\Mysql\Date

и затем может быть использован в вашем DQL (как в вашем запросе), как

DATE(jobs.endDate) AS endDate
11

Или, если вы не хотите добавлять новую зависимость, вы можете использовать такой код:

$dateTime = new \DateTime();
$qb
->andWhere('jobs.endDate BETWEEN :dateMin AND :dateMax')
->setParameters(
[
'dateMin' => $dateTime->format('Y-m-d 00:00:00'),
'dateMax' => $dateTime->format('Y-m-d 23:59:59'),
]
);
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector