我需要你的帮助,我将如何将以下Mysql转换为Doctrine。
select * from calendar_data as c where LEAST(c.end, end) - GREATEST(c.start, start) > 0;
我试过这个:
$qb = $em->createQueryBuilder();
$query = $qb->select('items')
->from('\Admin\Entity\CalendarData','items')
->where('LEAST(items.end, :end) - GREATEST(items.start, :start) > 0')
->setParameter('start',$start)
->setParameter('end', $end);
(鉴于已提供$start
和$end
)
我有以下错误:
{
"type": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html",
"title": "Internal Server Error",
"status": 500,
"detail": "[Syntax Error] line 0, col 57: Error: Expected known function, got 'LEAST'"
}
我该怎么做?
这是我问题的生成的sql:
Mysql query to determine if the given datetime is included in the datetime interval
答案 0 :(得分:2)
答案 1 :(得分:0)
使用Beberlei's DoctrineExtensions扩展DQL以及更多MySQL函数,例如GREATEST
和LEAST
。
composer require beberlei/DoctrineExtensions
将您需要的功能添加到config.yml
doctrine:
orm:
dql:
string_functions:
least: DoctrineExtensions\Query\Mysql\Least
greatest: DoctrineExtensions\Query\Mysql\Greatest
安装和链接后,您首次尝试转换代码应该按预期工作:
$qb = $em->createQueryBuilder();
$query = $qb->select('items')
->from('\Admin\Entity\CalendarData','items')
->where('LEAST(items.end, :end) - GREATEST(items.start, :start) > 0')
->setParameter('start',$start)
->setParameter('end', $end);