TP8中where数组条件含运算符时必须用二维数组格式,如[['field','op','val']],不再支持['field'=>['op','val']]的一维嵌套写法;等于号可省略,like需手动拼通配符,in自动识别值数组,且已废弃egt/elt等旧别名。

TP8 中数组条件用 ['field', 'exp', 'value'] 写法必须是二维数组
TP8 不再接受 TP5/6 那种 ['id' => ['gt', 100]] 的一维嵌套写法。只要用了运算符(如 gt、like、in),就必须用二维数组结构:[['field', 'operator', 'value']] 或多个条件并列:[['a','>','1'], ['b','like','%x%']]。
常见错误现象是直接写 User::where(['status'=>['eq',1]])->select(),这在 TP8 里会报错或生成意外 SQL —— 它会被当成字段值为数组,最终生成 status IN (1) 而非 status = 1。
- 正确写法(单条件):
User::where([['status', '=', 1]])->select() - 正确写法(多条件 AND):
User::where([['id','>','5'], ['name','like','%admin%']])->select() - 等于号可省略:
['status', '=', 1]等价于['status', 1],但带运算符时不能省
like 和 in 在 TP8 数组条件中行为不同
like 必须显式写出操作符,且通配符要自己拼;in 则对值数组自动识别 —— 这是容易混淆的关键点。
比如 ['id', [1,2,3]] 在 TP8 会被当作 IN 查询,等效于 id IN (1,2,3);但 ['name', 'like', '%test'] 不会自动加 %,你得手动补全。
立即学习“PHP免费学习笔记(深入)”;
-
like示例:['username', 'like', "%{$keyword}%"](注意双引号包裹变量) -
not like写法:['username', 'not like', '%temp%'](空格不能少) -
in示例:['type', [1,3,5]]→ 自动转成type IN (1,3,5) -
not in写法:['type', 'not in', [1,3,5]](不能写成['type', ['not in', [1,3,5]]])
TP8 不再支持 egt/elt 等旧表达式别名
TP5/6 支持的 egt(>=)、elt(neq(!=)等字符串别名,在 TP8 中已废弃。现在统一用标准 SQL 运算符:>=、<=、<> 或 !=。
如果你沿用老项目代码,把 ['score', 'egt', 60] 直接搬进 TP8,它不会报错,但会当作文本值处理,生成类似 score = 'egt' 的错误 SQL。
- 替代方案:
['score', '>=', 60]、['score', '<=', 100]、['status', '<>', 0] - 大小写不敏感,但推荐小写保持一致性
-
BETWEEN仍需用between表达式:['age', 'between', [18, 60]]
动态构建多条件数组时,空条件必须过滤
用户搜索表单提交的参数常有为空的情况,如果直接塞进 where 数组,会导致 SQL 语法错误或逻辑异常。TP8 不会自动跳过空值,必须手动判断。
例如 $name = '' 时,['name', 'like', "%{$name}%"] 会变成 name LIKE '%%',可能查出全部数据,也可能被数据库优化掉,但语义已失控。
- 安全写法:
if ($name) { $where[] = ['name', 'like', "%{$name}%"]; } - 避免用
array_filter()直接清空,因为0、false、null也会被误删 - 组合条件建议始终初始化为
$where = [],再逐个push,别依赖索引数组自动合并



















