【问题标题】:Convert SQL to Doctrine with LEAST and GREATEST functions使用 LEAST 和 GREATEST 函数将 SQL 转换为 Doctrine
【发布时间】:2017-03-15 07:07:45
【问题描述】:

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

【问题讨论】:

    标签: php mysql symfony doctrine-orm doctrine


    【解决方案1】:

    使用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
      

    安装和链接后,您第一次尝试转换代码应该可以正常工作:

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

    【讨论】:

      【解决方案2】:

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

      use Doctrine\ORM\Query\ResultSetMapping;
      
      $start = '';
      $end = '';
      $rsm = new ResultSetMapping();
      $rsm->addEntityResult('CalendarData', 'c');
      $rsm->addFieldResult('c', 'id', 'id');
      $rsm->addFieldResult('c', 'start', 'start');
      $rsm->addFieldResult('c', 'end', 'end');
      
      $query = $this->_em->createNativeQuery('select * from calendar_data where LEAST(c.end, ?) - GREATEST(c.start, ?) > 0;', $rsm);
      $query->setParameter(1, $end);
      $query->setParameter(2, $start);
      
      $calendarData = $query->getResult();
      

      阅读学说中的原生 sql here

      【讨论】:

      • 嗨@Denis,日历数据表被软删除,每当我在选择列deleted_at为NULL的日历数据时运行本机代码时,即使列删除后应该有结果,它也不会显示任何结果一片空白。我不知道为什么会这样。我的查询如下所示:select * from calendar_data as c where LEAST(c.end, "2017-03-14 11:18:30") - GREATEST(c.start, "2017-03-14 10:18:30") > 0 AND c.deleted_at = NULL;。我注意到它还与列 deleted_at 不为空的其他数据一起查找。
      猜你喜欢
      • 2011-04-17
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      相关资源
      最近更新 更多