isEmpty() 仅用于查询前判断 where 条件是否为空,不可在 find()/select() 后调用;查单条用 find() 判 null,查多条依 resultset_type 选 isEmpty() 或 empty()。

isEmpty() 不是用来判断「查出来的数据空不空」的,它只在查询还没执行前,判断「你写的 where 条件有没有」——查完再调,必报 Fatal error: Call to undefined method isEmpty()。
查单条用 find(),结果为 null 就是空
这是最直接、最安全的方式。TP 模型的 find() 明确约定:查不到返回 null,不是对象也不是数组,就是 PHP 原生 null。
- ✅ 正确写法:
if (is_null($user = User::find(123))) { /* 不存在 */ } - ❌ 错误写法:
User::find(123)->isEmpty()(find()返回的是模型实例或null,没有isEmpty()方法) - ⚠️ 注意:
findOrEmpty()返回的是空模型对象(非null),此时才能用$user->isEmpty(),但这个方法本身是「兜底用的」,不是常规判断手段
查多条用 select(),结果为 [] 就是空
关键看你的 database.php 配置里 resultset_type 是什么:
- 默认 TP6/8 是
'resultset_type' => 'collection'→select()返回think\Collection对象 → 可以用$list->isEmpty() - 如果手动设成
'resultset_type' => 'array'或 TP5.1 默认行为 →select()返回二维数组 → 只能用empty($list)或count($list) === 0 - ⚠️ 混用会出错:比如配置是
collection却写了if (empty($list)),虽然 PHP 不报错,但语义模糊;反之,配置是array却调$list->isEmpty(),直接报错
isEmpty() 真正该用的地方:构建查询条件时
它属于 Query 或 Builder 类,只在 SQL 还没发出去之前有效,典型场景是链式调用中做条件预判。
立即学习“PHP免费学习笔记(深入)”;
- ✅ 合法用法:
$query = User::where($where); if ($query->isEmpty()) { /* $where 是空数组或 null */ } - ✅ 合法用法:
User::where('status', 1)->where($dynamicCond)->isEmpty()(检查整个 where 链是否为空) - ❌ 所有带
->find()、->select()、->get()的链式结尾后,再调isEmpty()都无效 - ? 提示:这种用法极少出现在业务逻辑里,多见于封装通用查询方法时做参数校验
最容易被忽略的一点:TP6 和 TP5.1 的 select() 返回类型默认不同,同一段判断代码在两个版本里可能一个运行正常、一个直接 fatal error。别靠记忆写判断逻辑,先 var_dump($result) 看清类型再下手。



















