thinkphp模型层是智能查询对象而非orm,需继承think\model启用查询能力,自动处理表名、字段、时间戳等;save()依主键决定增删改,update()强制更新;链式查询需终结方法触发执行。

模型类必须继承 think\Model 才能启用查询能力
直接 new 一个普通类,哪怕叫 User,调用 select() 会报 Fatal error: Call to undefined method User::select()。只有继承 think\Model 后,框架才注入查询构造器、自动识别表名、绑定连接等能力。
- 类文件路径需符合命名空间规范,如
app\model\User对应app/model/User.php - 若表名不符合默认规则(如前缀为
tp_,但类名User对应表tp_user),必须显式声明protected $table = 'tp_user'; - 不建议用
D('User')或M('user')这类 ThinkPHP 3.x 风格写法,TP5/6 中已废弃或仅作兼容,且无法享受自动依赖注入、类型提示等现代特性
save() 和 update() 的行为差异极易混淆
save() 是模型实例方法,依赖主键存在与否决定插入还是更新;update() 是静态方法,强制执行 UPDATE 语句,不检查主键是否已存在。
-
$user = new User(); $user->name = 'a'; $user->save();→ INSERT,返回 true/false -
$user = User::find(1); $user->name = 'b'; $user->save();→ UPDATE,影响行数 > 0 才返回 true -
User::update(['name' => 'c'], ['id' => 1]);→ 强制 UPDATE,即使 id=1 不存在也返回 0,不抛异常 - 误用
save()更新多条记录会失败:它只接受单条数据,批量更新必须用update()或Db::table()->where()->update()
链式查询最终执行靠 select()、find()、value() 等触发
像 User::where('status', 1)->order('id desc') 这段代码本身不发 SQL,只是构建查询条件对象。真正执行取决于你最后调用哪个“终结方法”。
-
find()返回单条记录(数组或 null) -
select()返回对象集合(Collection),可链式调用toArray()转数组 -
value('name')只取指定字段第一个值(字符串或 null),避免整个对象加载 -
column('name', 'id')返回关联数组:[1 => '张三', 2 => '李四'],适合下拉选渲染 - 漏掉终结方法会导致后续逻辑静默失败——比如把
User::where(...)->delete()写成User::where(...),删不掉任何数据,也不报错
时间戳字段必须显式开启,否则 create_time 不会自动写入
即使数据库字段存在且类型为 DATETIME,模型也不会默认填充时间戳。必须在模型类中声明:
-
protected $autoWriteTimestamp = true;(默认按int类型写入,即时间戳秒数) - 若字段是
DATETIME,得写成protected $autoWriteTimestamp = 'datetime'; - 字段名非默认(
create_time/update_time)时,还需定义:protected $createTime = 'created_at'; protected $updateTime = 'updated_at'; - 注意:该机制只对
save()和create()生效,Db::table()->insert()不受控制
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











