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

G. *_*urs 3 php mysql doctrine symfony doctrine-orm

我需要你帮助我如何将以下 Mysql 转换为 Doctrine。

select * from calendar_data as c where LEAST(c.end, end) - GREATEST(c.start, start) > 0;
Run Code Online (Sandbox Code Playgroud)

我试过这个:

$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);
Run Code Online (Sandbox Code Playgroud)

(鉴于此,$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'"
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

这是我的问题生成的sql:

Mysql查询判断给定的日期时间是否包含在日期时间间隔内

Eri*_*kov 5

使用Beberlei 的 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
    
    Run Code Online (Sandbox Code Playgroud)

安装和链接后,您第一次尝试转换代码应该会按预期工作:

$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);
Run Code Online (Sandbox Code Playgroud)