
本文详解 Yii2 框架中 deleteAll() 方法在处理复合查询条件(如 AND、NOT、数组字段匹配等)时的正确写法,重点解决因条件格式错误导致的 strtoupper() expects parameter 1 to be string 类型异常。
本文详解 yii2 框架中 `deleteall()` 方法在处理复合查询条件(如 and、not、数组字段匹配等)时的正确写法,重点解决因条件格式错误导致的 `strtoupper() expects parameter 1 to be string` 类型异常。
在 Yii2 中,ActiveRecord::deleteAll() 是执行批量删除操作的高效方式,但其参数格式对条件结构高度敏感。常见错误是将多个条件项(尤其是含运算符如 NOT 的子条件)以扁平数组形式直接传入,例如:
// ❌ 错误写法:混合键值对与嵌套表达式,导致 QueryBuilder 解析失败
AllAdjustments::deleteAll([
'plan_year_id' => $plan_year_id,
'column_type' => array_keys($allAdjustment),
'is_auto' => $is_auto,
['NOT', ['column_id' => 1]], // 此处破坏了键值对结构
]);上述代码会触发 strtoupper() expects parameter 1 to be string, array given 错误,根本原因在于:Yii2 的 QueryBuilder 在解析条件时,期望顶层条件为字符串(如 'id = :id')或标准运算符数组(如 ['AND', ...]),而传入的混合数组(既有关联键又有索引子数组)会导致内部类型判断失败。
✅ 正确做法是显式使用逻辑运算符封装所有条件,统一采用 ['AND', ...] 或 ['OR', ...] 结构,并将每个原子条件(包括 NOT 表达式)作为独立元素传入:
AllAdjustments::deleteAll([
'AND',
['plan_year_id' => $plan_year_id],
['column_type' => array_keys($allAdjustment)],
['is_auto' => $is_auto],
['NOT', ['column_id' => 1]],
]);该写法明确声明所有条件需同时满足(AND 逻辑),且每个子条件均为合法的 Yii2 查询条件格式——无论是键值对(自动转为 =, IN 等)还是嵌套运算符表达式(如 ['NOT', [...]])。array_keys($allAdjustment) 会被自动识别为 IN 查询,无需额外处理。
? 关键注意事项:
- 不要混用关联数组与索引数组作为顶层条件;必须用 ['AND'/'OR', ...] 显式包裹;
- NOT、OR、BETWEEN、LIKE 等运算符必须以数组形式(如 ['NOT', $condition])嵌套在主条件中;
- 所有变量(如 $plan_year_id、$is_auto)应确保已定义且类型安全,避免 null 导致意外 SQL 语义;
- 生产环境建议配合事务使用,并添加日志记录删除影响行数:
$deleted = AllAdjustments::deleteAll([...]); \Yii::info("Deleted {$deleted} AllAdjustments records", __METHOD__);
掌握此结构化条件写法,不仅能规避解析异常,还能提升复杂查询的可读性与可维护性,是 Yii2 高级数据操作的必备实践。










