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

如何将数组传入WHERE条件?动态多条件查询参数赋值问题

解决多动态条件的参数绑定问题

首先,你需要构建关联参数数组和对应的关联类型数组,来匹配动态生成的每个:key占位符。单条件时用索引数组没问题,但多条件下关联数组能更清晰地对应每个占位符和它的值、类型。

完整修改后的代码示例

$em = $this->getEntityManager();
$sql = "SELECT * FROM products AS p";
$wheres = [
    "brand_name" => ["a", "b"],
    "category_type" => ["AA"]
];

$params = [];
$types = [];
$i = 0;

foreach ($wheres as $key => $value) {
    if ($i === 0) {
        $sql .= " WHERE";
    } else {
        $sql .= " AND";
    }
    // 注意:你原来的SQL里用了`te.$key`,但FROM是products AS p,这里大概率是笔误,我改成了p.$key,可根据实际表别名调整
    $sql .= " p.$key IN (:$key)";
    // 把每个条件的值存入参数数组,键和占位符完全一致
    $params[$key] = $value;
    // 根据字段类型设置对应的数组参数类型,这里默认按字符串数组处理
    $types[$key] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
    
    $i += 1;
}

// 执行查询
$query = $em->getConnection()->executeQuery(
    $sql,
    $params,
    $types
);
$records = $query->fetchAll();

关键说明

  • 参数数组($params):使用关联数组,键名必须和SQL里的占位符(比如:brand_name、:category_type)完全匹配,这样Doctrine才能正确绑定每个条件的值数组。
  • 类型数组($types):同样用关联数组,每个键对应参数的类型。如果是整数数组(比如product_id),就用PARAM_INT_ARRAY;字符串数组用PARAM_STR_ARRAY,以此类推。这一步能避免SQL注入,同时保证参数类型正确。
  • 灵活适配不同字段类型:如果条件里混合了不同类型的字段,只需要在循环里判断字段名来设置类型即可:
    foreach ($wheres as $key => $value) {
        // ... 省略SQL拼接逻辑
        
        $params[$key] = $value;
        if ($key === 'product_id') {
            $types[$key] = \Doctrine\DBAL\Connection::PARAM_INT_ARRAY;
        } else {
            $types[$key] = \Doctrine\DBAL\Connection::PARAM_STR_ARRAY;
        }
    }
    

这种方式既能灵活处理动态条件,又能保证查询的安全性和正确性,完美适配你的需求。

内容的提问来源于stack exchange,提问作者nas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:28:11