Doctrine查询布尔值触发语法错误:预期字符串结尾,得到'1'
解决Doctrine查询中布尔值引发的语法错误问题
看起来你是在给Cats实体添加了active布尔字段后,查询突然爆了语法错误——这种情况我之前也碰到过,大概率是布尔值在DQL里的写法不符合规范导致的。
先给你拆解下错误原因:你看到的「预期字符串结尾,却得到'1'」,本质是Doctrine的DQL解析器把你写的布尔值(比如1/0)当成了未闭合字符串的一部分,没法正确解析。DQL和原生SQL不一样,对布尔类型的处理有自己的规则,不能直接写数字或者随便拼接布尔值。
下面给你两种正确的处理方式,推荐第一种:
方式一:使用参数绑定(最安全,推荐)
参数绑定是Doctrine官方推荐的写法,既能避免语法错误,还能防止SQL注入,而且Doctrine会自动根据字段类型转换参数:
$results = $this->getDoctrine()->getRepository('RealBundle:Cats') ->createQueryBuilder('q') ->addSelect('ABS(q.pts) AS HIDDEN pointsOrder') // 用参数占位符替代直接写布尔值 ->where('q.active = :active') // 直接传入PHP布尔值,Doctrine会处理类型转换 ->setParameter('active', true) ->orderBy('pointsOrder', 'DESC') ->getQuery() ->getResult();
方式二:使用DQL布尔关键字
如果你不想用参数绑定,也可以直接在DQL里写大写的TRUE或FALSE关键字,这是DQL认可的布尔常量:
$results = $this->getDoctrine()->getRepository('RealBundle:Cats') ->createQueryBuilder('q') ->addSelect('ABS(q.pts) AS HIDDEN pointsOrder') ->where('q.active = TRUE') ->orderBy('pointsOrder', 'DESC') ->getQuery() ->getResult();
要避免的错误写法
你之前可能不小心用了这些错误写法,才导致的语法错误:
- 直接拼接PHP布尔值:比如
->where('q.active = ' . true),这会把true转成1,DQL变成q.active = 1,解析器会把1当成字符串的一部分,引发错误 - 用引号包裹布尔值:比如
->where("q.active = 'true'"),这会把布尔值当成字符串处理,不仅语法可能出问题,查询结果也会不对
内容的提问来源于stack exchange,提问作者net
相关产品推荐
相关产品推荐

