使用LEAST和GREATEST函数将SQL转换为Doctrine

时间:2017-03-15 07:07:45

标签: php mysql symfony doctrine-orm doctrine

我需要你的帮助,我将如何将以下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

2 个答案:

答案 0 :(得分:2)

Doctrine中没有LEAST和GREATES函数。您可以重写查询以获得相同的结果,或使用ResultSetMapping,如

Facebook

在doctrine here

中阅读本机sql

答案 1 :(得分:0)

使用Beberlei's DoctrineExtensions扩展DQL以及更多MySQL函数,例如GREATESTLEAST

  1. 安装库=> composer require beberlei/DoctrineExtensions
  2. 将您需要的功能添加到config.yml

    doctrine:
        orm:
            dql:
                string_functions:
                    least: DoctrineExtensions\Query\Mysql\Least
                    greatest: DoctrineExtensions\Query\Mysql\Greatest
    
  3. 安装和链接后,您首次尝试转换代码应该按预期工作:

    $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);