如何将数组传入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
相关产品推荐
相关产品推荐

