thinkphp 8.0 模型必须严格遵循命名、路径、继承与字段映射规则:类名user对应app/model/user.php文件,命名空间为app\model,继承think\model;表名、字段名、主键、时间戳、软删除及关联均需显式配置,否则功能失效。

ThinkPHP 8.0 的模型不是“写出来就行”,而是必须严格匹配命名、路径、继承和字段映射规则,否则 User::get(1) 会静默失败或抛出 Class 'app\model\User' not found —— 这不是代码写错了,是规范没对上。
模型类名与文件路径必须完全对应 PSR-4 规则
ThinkPHP 8.0 不再容忍“大小写松动”或“别名映射”。app\model\User 命名空间必须由 app/model/User.php 文件提供,且该文件中类定义必须是:
namespace app\model;
use think\Model;
class User extends Model
{
}
常见错误现象:
- 把文件命名为
user.php或usermodel.php→ 自动加载失败 - 类名写成
user或UserModel→ 框架无法识别为标准模型 - 路径写成
app/models/User.php(复数 models)→ PSR-4 映射中断
注意:数据库表前缀默认为 think_,所以 User 类自动对应 think_user 表;若表名是 tp_user,需在模型中显式设置:protected $table = 'tp_user';
字段赋值和查询必须区分大小写且禁用魔术属性
ThinkPHP 8.0 默认关闭字段名自动转小写,数据库字段 user_name 在模型中必须用 user_name 访问,不能写成 userName(除非开启 convertName 配置)。
实操建议:
- 新增数据时,用数组赋值要严格按数据库字段名:
User::create(['user_name' => 'foo', 'email' => 'a@b.c']) - 查询条件也一样:
User::where('status', 1)->select(),不能写where('Status', 1) - 避免在模型里定义
public $userName这类非真实字段属性,它不会被写入数据库,也不参与自动验证 - 如需驼峰访问,可在模型中启用:
protected $convertName = true;,但要注意这会影响原生 SQL 查询和关联字段推导
主键、时间戳、软删除这些基础配置不能靠“猜”
ThinkPHP 8.0 不再默认假设主键是 id 或时间字段是 create_time。不显式声明,就等于关闭功能。
典型配置项(写在模型类内):
- 主键不是
id?→protected $pk = 'uid'; - 创建时间字段叫
add_time?→protected $createTime = 'add_time'; - 想自动写入创建/更新时间?→
protected $autoWriteTimestamp = true; - 用软删除且字段是
is_deleted?→use think\model\concern\SoftDelete; protected $deleteTime = 'is_deleted';
漏掉 $autoWriteTimestamp,create_time 字段永远为空;漏掉 $deleteTime,delete() 会执行硬删。
关联定义必须用方法返回,不能用属性或数组
ThinkPHP 8.0 的关联(一对一、一对多等)只认“返回关联对象的方法”,比如 hasone、hasmany,写成属性或静态数组会直接忽略。
正确写法示例(User 模型关联 Profile):
public function profile()
{
return $this->hasOne(Profile::class, 'user_id', 'id');
}
错误写法:
-
public $profile = Profile::class;→ 无任何效果 -
protected $relation = ['profile'];→ ThinkPHP 8.0 已废弃该方式 - 方法名不带括号调用:
$user->profile能取到数据,但这是动态获取,不是定义;定义必须是方法
另外,关联方法名就是关联别名,$user->profile 中的 profile 必须和方法名完全一致,包括大小写。
最常被忽略的一点:模型类必须放在 app/model/ 下,且不能有同名的 app/common.php 中的函数覆盖 User 类名——这种冲突不会报错,但会导致 new User() 实例化的是函数返回值而非模型对象。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











