Symfony3.4自定义Doctrine扩展实现Postgres OVERLAPS函数报错求助
解决Symfony 3.4中Doctrine扩展PostgreSQL OVERLAPS函数的语法错误
看起来你遇到的问题根源在于Doctrine DQL函数的注册类型错误,以及可能的DQL条件写法问题,我来一步步帮你解决:
1. 修正函数注册类型
你当前把overlaps函数注册在了string_functions下,但这个函数返回的是布尔值(PostgreSQL的OVERLAPS返回true/false),Doctrine需要将其归类到boolean_functions中,否则解析器会把它当作字符串函数处理,导致WHERE子句的语法校验失败。
修改你的Doctrine配置:
orm: dql: boolean_functions: overlaps: AppBundle\Driver\DateOverlaps
2. 调整DQL条件写法(可选但保险)
虽然注册为布尔函数后应该可以直接在WHERE子句中使用,但有些版本的Doctrine DQL解析器可能仍然期望明确的布尔比较,你可以把条件改成:
public function findRangedEvents(\DateTime $start, \DateTime $end) { $qb = $this->createQueryBuilder('event') ->where("overlaps(:start, :end, event.occuringDate, event.occuringEndDate) = true") ->setParameter('start', $start) ->setParameter('end', $end); return $qb->getQuery()->getResult(); }
3. 验证生成的SQL
为了确认函数是否正确生成了PostgreSQL语法,你可以在执行查询前打印出生成的SQL:
echo $qb->getQuery()->getSQL();
正常情况下应该输出类似这样的语句:
SELECT e FROM AppBundle\Entity\Event e WHERE (?, ?) OVERLAPS (e.occuringDate, e.occuringEndDate) = true
如果能得到这样的结果,说明你的函数扩展逻辑是正确的。
额外检查点
- 确保实体的
occuringDate和occuringEndDate字段被正确映射为datetime类型(在实体注解或XML/YAML映射中配置); - 确认你的Symfony 3.4对应的Doctrine版本支持
boolean_functions配置(Symfony 3.4搭配的Doctrine ORM版本是2.5+,完全支持这个配置项)。
内容的提问来源于stack exchange,提问作者Florent Destremau
相关产品推荐
相关产品推荐

