thinkphp 6.x 和 5.1+ 的 think\model 类没有 model() 静态方法;正确用法是直接调用静态查询如 user::find(1),或 new user() 实例化,而非 user::model()。

ThinkPHP 模型中 model 方法不存在,别被 IDE 或旧文档误导
ThinkPHP 6.x 和 5.1+ 的核心模型类(think\Model)根本没有叫 model() 的静态方法。如果你在代码里写了 User::model() 或看到报错 Call to undefined method think\Model::model(),说明你误用了 Laravel 风格的写法,或参考了过时的 TP3/TP5.0 文档。
真实可用的入口是 new static()、instance(),或者更常用的——直接调用静态查询方法:
-
User::find(1)、User::where('status', 1)->select()等,底层自动实例化模型 - 需要手动新建空模型对象时,用
new User(),不是User::model() - TP6 中
think\Model::instance()是受保护方法,仅用于内部克隆,不对外暴露
TP5.1 里曾有 model(),但它是门面(Facade),不是模型本身的方法
在 ThinkPHP 5.1 中,think\model()(注意是函数,不是模型方法)确实存在,但它属于「门面函数」,作用是快捷获取模型类实例,等价于 new \app\model\User。它和 User::model() 完全无关 —— 后者从来就没定义过。
常见误用场景:
- 复制了别人写的 TP5.1 全局函数调用,却放在模型类内部当静态方法用 → 报错
- IDE 自动补全把
model()当成模型方法推荐(因命名空间混淆)→ 实际运行就挂 - 想复用 Laravel 的
User::model()->with(...)写法 → TP 不支持这种链式构造器
真正该用的模型实例化方式:按场景选对方法
模型本质是 PHP 类,实例化逻辑必须匹配使用意图:
- 查数据:直接用静态查询方法,如
User::get(1)或User::where(...)->find(),无需手动 new - 写新记录:用
$user = new User(); $user->name = 'xxx'; $user->save(); - 批量赋值(含验证):用
User::create(['name' => 'xxx']),它内部会 new + validate + save - 从数组构造(不入库):仍用
new User($data),避免触发自动写入逻辑
注意:User::create() 和 new User($data) 对 $fillable / $guarded 的处理一致,但前者强制走验证和事件,后者不会。
自定义 model() 方法?可以,但得自己加,且要小心覆盖风险
如果你坚持要一个类似 Laravel 的 model() 静态方法,可以在基类 BaseModel 里手动定义:
class BaseModel extends Model
{
public static function model()
{
return new static();
}
}
但这样做的代价是:
- 每次调用都 new 一个未初始化的实例,无法复用查询构建器
- 容易和
self::class、static::class混淆,后续调->where()会出错(因为不是 Query 对象) - TP6 已移除所有全局模型门面,强行加反而增加维护成本
真要统一入口,优先考虑封装一个 Service 类,而不是往模型上堆静态方法。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











