如何在Doctrine的DQL中实现多列组合的WHERE IN条件查询
解决方案
方案1:原生DQL实现(无需额外依赖)
DQL原生不支持多列组合IN语法,可通过拼接等值条件组实现,逻辑与原生SQL完全等价,写法规范整洁:
$values = [['value1', 'value2'], ['value3', 'value4']]; $qb = $this->createQueryBuilder('s'); $orConditions = $qb->expr()->orX(); foreach ($values as $index => [$col1Val, $col2Val]) { $orConditions->add( $qb->expr()->andX( $qb->expr()->eq('s.column1', ":col1_$index"), $qb->expr()->eq('s.column2', ":col2_$index") ) ); $qb->setParameter("col1_$index", $col1Val) ->setParameter("col2_$index", $col2Val); } $result = $qb->where($orConditions) ->getQuery() ->getResult();
该写法完全符合DQL语法规范,无需依赖第三方组件,参数绑定全程自动处理,不存在SQL注入风险,性能和原生多列IN查询基本一致。
方案2:通过Doctrine扩展支持原生多列IN写法
如果项目允许引入第三方扩展,可使用beberlei/doctrineextensions包提供的InGroup函数,实现和原生SQL几乎一致的简洁写法:
- 安装扩展包
composer require beberlei/doctrineextensions
- 在Symfony的Doctrine配置文件中注册自定义函数
# config/packages/doctrine.yaml doctrine: orm: dql: string_functions: IN_GROUP: DoctrineExtensions\Query\Mysql\InGroup
非MySQL数据库可选用对应数据库适配的
InGroup实现类注册即可。
- 直接编写多列IN查询
$values = [['value1', 'value2'], ['value3', 'value4']]; $result = $this->createQueryBuilder('s') ->where('IN_GROUP(s.column1, s.column2) IN (:values)') ->setParameter('values', $values) ->getQuery() ->getResult();
内容的提问来源于stack exchange,提问作者ntyss
相关产品推荐
相关产品推荐

