静态调用最稳妥,如user::find(1);模型须继承think\model,否则报错;find()只接受主键值,条件查询需用where()->find();批量操作优先用select()和saveall();update()静态与实例方法参数顺序不同,推荐where()->update()。

直接用静态方法调用最稳妥,比如 User::find(1) 或 User::where('status', 1)->select();不建议 new 实例后手动调用查询方法,容易绕过模型初始化逻辑。
模型类必须继承 think\Model 才能用静态查询方法
很多新手写完模型类发现 ::find() 报错,根本原因是没正确继承基类。模型文件(如 app\model\User.php)开头必须有:
namespace app\model;
use think\Model;
class User extends Model
{
// 可选:显式指定表名(若不符合默认规则)
protected $name = 'user';
}
漏掉 use think\Model 或没 extends Model,::find()、::select() 这些静态方法就不存在——PHP 会报 Call to undefined method 错误。
find() 只接受主键值,不能传条件数组
这是高频翻车点:User::find(['username' => 'admin']) 会静默返回 null,不是语法错误,但结果完全不对。
-
User::find(5)✅ 正确:按主键查单条 -
User::where('username', 'admin')->find()✅ 正确:带条件查单条 -
User::find(['username' => 'admin'])❌ 错误:会被当成主键值['username' => 'admin']去查,找不到
原因在于 find() 底层只处理标量主键(int/string),不解析数组条件。条件查询必须走 where() 链式调用。
批量操作优先用 select() 和 saveAll(),别用循环 new + save()
比如插入 10 条用户数据:
- ❌ 避免这样写(性能差、事务难控制):
$user = new User(); $user->save($data1); $user = new User(); $user->save($data2); ... - ✅ 推荐这样写(一次 SQL、自动时间戳、支持事务):
User::saveAll([$data1, $data2, ...]) - ✅ 查询多条也同理:
User::where('status', 1)->select()返回的是Collection对象,不是原始数组
select() 和 saveAll() 是模型层封装的批量接口,内部做了字段过滤、事件触发、时间戳写入等处理;而手动 new 实例再调用实例方法,会跳过部分模型生命周期钩子。
update() 静态方法和实例方法行为不同
更新数据时,这两个写法效果不一样:
-
User::update(['id' => 5, 'name' => 'foo'])✅ 自动识别id为主键条件,执行UPDATE ... WHERE id=5 -
(new User())->update(['name' => 'foo'])❌ 没传条件,会尝试更新全表(除非模型里设了默认 where)
更危险的是:User::update(['name' => 'foo'], ['id' => 5]) 第二个参数才是 where 条件,第一个是 data —— 参数顺序和实例方法的 save() 不一致,容易混淆。实际开发中,明确用 where()->update() 更直观不易错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











