不是语法写错,是TP6.0.1查询构造器、返回类型和异常机制全面变更:where数组仅支持字段=值简写,select返回Collection需toArray()转数组,findOrFail抛ValidateException而非DbException。

直接结论:不是语法写错,是 TP6.0.1 的查询构造器、返回类型和异常机制全变了,老代码不改必报错。
where 条件数组写法失效
TP5.1 支持 where(['id' => ['in', [1,2,3]], 'status' => 1]) 这种混合操作符的数组;TP6.0.1 只把数组当「字段=值」简写,['id' => ['in', [1,2,3]]] 会被当成 id = ['in', [1,2,3]] 字符串匹配,查不到数据还无提示。
- 改用链式调用:
->where('id', 'in', [1,2,3])->where('status', '=', 1) - 或统一包进闭包:
->where(function ($query) { $query->where('id', 'in', [1,2,3])->where('status', 1); }) - 别再依赖数组自动推导操作符——TP6.0.1 已砍掉该逻辑
select() 返回值不能当数组用
TP5.1 的 User::select() 返回原生二维数组,$list[0]['name'] 直接可取;TP6.0.1 返回 think\Collection 对象,$list[0]['name'] 会报 Fatal error: Cannot use object of type think\Collection as array。
- 要取原生数组,必须显式调用
->toArray():User::where('status', 1)->select()->toArray() - 遍历仍可用
foreach ($list as $item)(Collection 实现了Iterator) - JSON 输出前别假设它等于数组——
json_encode($list)虽能工作,但若模型重写了toJson()或设置了$hidden,结果可能和toArray()不一致
findOrFail() 抛的异常类型变了
TP5.1 的 findOrFail() 找不到时抛 think\exception\DbException;TP6.0.1 改抛 think\exception\ValidateException,且默认带 HTTP 404 响应头。如果你原来 catch (DbException $e) 想兜住它,现在完全捕获不到。
立即学习“PHP免费学习笔记(深入)”;
- 升级后必须改捕获逻辑:
catch (\think\exception\ValidateException $e) - 如果只是想判断是否存在,不如直接用
find()+ 空值检查,避免异常开销 - 注意:这个异常在 API 接口里会自动设置 404 响应头,若你手动 catch 后又返回 200,前端可能收不到预期状态码
最易被忽略的是 PHP 版本和 Composer 依赖的隐性耦合:TP6.0.1 要求 PHP ≥ 7.2.5,但如果你服务器上 CLI 和 FPM 用的不是同一个 PHP 版本,composer install 成功了,网页一跑就报 ParseError 或 Class not found——得用 php-fpm -v 单独确认 Web 环境的真实版本。



















