thinkphp6模型创建失败主因是路径、命名或配置不匹配:必须放app/model下,类名goods对应表shop_goods,命名空间app\model,主键非id需设$pk,调用前正确use,且方法名不可覆盖内置方法。

模型创建失败,八成是命名或路径没对上——ThinkPHP6 不靠配置文件注册模型,全靠目录结构、类名和表名的自动映射规则。
模型文件必须放在 app/model 目录下
不是随便建个 model 文件夹就行。ThinkPHP6 默认只扫描 app/model(注意是小写、无空格、无额外层级)。如果放错位置,比如 app/Model(首字母大写)或 app/models(复数),Goods::select() 会直接报错 Class 'app\model\Goods' not found。
- 正确路径:
app/model/Goods.php - 错误路径示例:
app/Model/Goods.php、app/model/goods.php(类名大小写敏感)、app/model/Goods/Goods.php - 若项目启用了多应用,需确认当前应用名(如
admin),路径应为app/admin/model/Goods.php
class Goods extends \think\Model 必须继承且命名严格匹配表名
假设数据库表是 shop_goods,表前缀为 shop_,那么:
- 类名必须是
Goods(驼峰、首字母大写、去掉前缀) - 文件名必须是
Goods.php(与类名完全一致) - 命名空间必须是
app\model(不能漏掉app\或写成App\model) - 如果表名含大写字母(如
shop_userOrder),不能靠自动映射,必须显式设置:protected $name = 'user_order';或protected $table = 'shop_userOrder';
主键不是 id 时,find(6) 会静默失败
默认所有模型都把 id 当主键。如果你的表主键是 uid 或 goods_id,不声明就会查不到数据,也不报错,只是返回 null。
- 在模型类中加这一行:
protected $pk = 'uid'; - 验证是否生效:执行
Goods::get(6)(推荐用get而非find,语义更明确) - 如果仍为空,用
Db::name('goods')->where('uid', 6)->find()对比测试,确认是不是主键问题
控制器里调用模型前,别忘了 use 导入完整命名空间
常见错误是只写 use Goods; 或 use app\model;,这都不行。
- 正确写法:
use app\model\Goods; - 如果控制器名也是
Goods(比如app/controller/Goods.php),必须起别名:use app\model\Goods as GoodsModel; - 调用时用
Goods::select()是静态调用,不需要new Goods();手动 new 实例后调用方法(如$g = new Goods(); $g->where(...)->select())也能工作,但失去静态代理优势
最易被忽略的一点:模型类里定义的方法名不能和 ThinkORM 内置方法重名,比如自己写一个 public function find(),会覆盖掉父类的 find 静态方法,导致后续所有 Goods::find() 调用都走你写的空逻辑——连错误提示都没有,只有查不到数据。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











