You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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几乎一致的简洁写法:

  1. 安装扩展包
composer require beberlei/doctrineextensions
  1. 在Symfony的Doctrine配置文件中注册自定义函数
# config/packages/doctrine.yaml
doctrine:
    orm:
        dql:
            string_functions:
                IN_GROUP: DoctrineExtensions\Query\Mysql\InGroup

非MySQL数据库可选用对应数据库适配的InGroup实现类注册即可。

  1. 直接编写多列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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 17:51:03