thinkphp 6.0 与 5.1 的 db 类存在四大差异:where 条件不兼容数组写法,需链式调用或闭包;select 返回 collection 对象而非数组,须 toarray() 才能下标访问;strict 默认开启,插入未知字段会报错;insertgetid 推荐配合事务使用并捕获具体异常。

ThinkPHP 5.1 和 6.0 的 Db 类在基础用法上看似相似,但关键差异藏在细节里:字段处理、严格模式、返回值行为和链式调用兼容性。升级时若不注意,容易查不到数据、报错或逻辑异常。
where 条件写法不兼容
TP5.1 支持数组形式的 where,例如:
Db::table('user')->where(['status' => 1, 'type' => 'admin'])->select();这种写法在 TP6.0 中会被当作「字段 = 值」的简写,仅支持 = 操作,且无法表达 in、like、嵌套条件等。
- TP6.0 正确写法是链式调用:
where('status', '=', 1)->where('type', '=', 'admin') - 含 in 查询必须拆开:
where('id', 'in', [1,2,3]),不能写成['id' => ['in', [1,2,3]]] - 复杂逻辑建议统一用闭包:
where(function ($query) { $query->where('id', 'in', [1,2,3])->whereOr('status', 0); })
select 返回值类型变了
TP5.1 的 select() 直接返回 PHP 关联数组,可直接 foreach 或取键值:
TP6.0 开始返回 think\Collection 对象,不是原生数组:
- 直接
$list[0]['name']会报错(对象不支持数组下标访问) - 需显式转数组:
Db::table('user')->select()->toArray() - 遍历仍可用:
foreach ($list as $item) { echo $item['name']; }(Collection 实现了 Iterator) - JSON 输出前建议确认是否重写了
toJson(),避免字段遗漏
strict 模式默认行为不同
TP5.1 默认宽松:插入未知字段时静默忽略;TP6.0 默认开启严格模式,字段不存在直接抛异常。
- TP5.1 插入多余字段不报错:
Db::table('user')->insert(['name'=>'a','extra'=>'b']) - TP6.0 同样操作会报错「Unknown column 'extra'」
- 如需兼容旧逻辑,显式关闭:
Db::table('user')->strict(false)->insert($data) - 生产环境建议保持 strict(true),提前暴露字段定义问题
insertGetId 和事务处理更严谨
两者都支持 insertGetId(),但 TP6.0 对事务和错误兜底更明确:
- TP5.1 中
insert()失败可能返回false,需手动判断 - TP6.0 推荐搭配事务使用:
Db::transaction(function () use ($data) { return Db::name('user')->insertGetId($data); }); - 失败时统一抛出
think\db\exception\DataNotFoundException等具体异常类,便于捕获处理 - 不再推荐裸用
execute()执行 INSERT 语句,应优先走insert()方法保障类型安全
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











