TP8升级后where数组写法必须改为显式三元组:操作符不可省略,in/between值须为数组,闭包内需统一链式或二维数组,null判断须显式写'is null',二维数组键名须全为数字索引。

TP8 升级后 where 数组写法必须改,原 ['status' => 1, 'type' => ['in', 'a,b,c']] 这类写法会静默失效或报错,不是语法糖问题,而是底层解析逻辑重构导致的兼容断裂。
数组条件里的操作符必须显式拆成三元组
TP8 的 where() 不再自动识别字符串形式的操作符(如 'in'、'like'),所有非等值匹配都得用数组三元组表达:
- 错误写法:
->where(['status' => 1, 'name' => ['like', '%abc%']])—— 第二个条件会被当成字面量字符串,查不到数据 - 正确写法:
->where(['status' => 1])->where('name', 'like', '%abc%')或->where([['status', '=', 1], ['name', 'like', '%abc%']]) -
in必须传数组值:->where('id', 'in', [1, 2, 3]),不能再写->where('id', 'in', '1,2,3') -
between同理:->where('created_time', 'between', [strtotime('-7 days'), time()])
闭包嵌套中不能混用数组和链式 where
在闭包里写混合条件时,如果开头用了数组形式,后续链式调用会丢失上下文,导致括号层级错乱:
- 危险写法:
->where(function ($q) { $q->where(['a' => 1])->where('b', '>', 10); })—— TP8 可能只把第一个数组包进括号,第二个where被平铺到外层 - 安全写法:全部统一为链式:
->where(function ($q) { $q->where('a', '=', 1)->where('b', '>', 10); }) - 或者全部用二维数组:
->where(function ($q) { $q->where([['a', '=', 1], ['b', '>', 10]]); })
空值和 null 的判断必须显式写出操作符
TP6 允许 ['field' => null] 自动转成 IS NULL,TP8 已移除该隐式转换,不写操作符就等于忽略该条件:
- 无效写法:
->where(['name' => null, 'status' => 0])——name IS NULL不会生成,只剩status = 0 - 有效写法:
->where([['name', 'is null'], ['status', '=', 0]])或分开写:->where('name', 'is null')->where('status', '=', 0) - 注意:
'is null'和'is not null'是字符串字面量,不是常量,别加引号外的引号
最易被忽略的是数组条件里混用字符串和数字键:TP8 要求二维数组条件必须全为数字索引,[0 => ['a','=','1'], 'b' => ['c','=','2']] 会导致第二项被跳过——这不会报错,但数据就漏了。

















