ThinkPHP6.1.5模型开发接口的核心是静态调用与链式构造,支持简洁查询、动态条件拼接、分页预加载、缓存及空值安全处理,避免原生SQL和重复实例化。

ThinkPHP6.1.5中用模型开发接口,核心是让查询更简洁、可维护、少出错。不用写原生SQL,也不用反复new实例,靠静态调用+链式构造就能覆盖绝大多数接口场景。
基础查询直接套方法
查单条、查列表、按条件过滤,几行就搞定:
- 查ID为12的用户:User::find(12)(返回模型实例或null)
- 查状态正常的所有用户:User::where('status', 1)->select()(返回Collection)
- 查邮箱含“@example.com”的用户:User::where('email', 'like', '%@example.com%')->select()
- 只取id和name字段:User::where('status', 1)->field('id,name')->select()
动态条件安全拼接
接口常带多个可选参数(如搜索关键词、时间范围、状态筛选),别在循环里反复调where()——容易覆盖或漏判空值。
- 推荐先收集条件到数组:避免空值导致意外全表扫描
-
$where = [];
if (!empty($params['keyword'])) { $where['name'] = ['like', "%{$params['keyword']}%"]; }
if (isset($params['status'])) { $where['status'] = $params['status']; }
$list = User::where($where)->select(); - 含OR逻辑?用闭包包住:User::where(function ($q) use ($params) { $q->where('title', 'like', "%{$params['k']}%")->whereOr('content', 'like', "%{$params['k']}%"); })->select();
分页和关联预加载不踩坑
接口返回列表基本都要分页,with()加载关联也高频,但写法不对会报错或性能差。
立即学习“PHP免费学习笔记(深入)”;
- 分页必须放在select之前:User::where('status', 1)->order('id desc')->paginate(10)(不是 select()->paginate())
- 预加载带条件?必须用闭包:User::with(['profile' => function ($q) { $q->where('is_active', 1); }])->select();
- 多关联不同条件,分开写闭包:User::with(['posts' => $postCond, 'tags' => $tagCond]),别共用一个$query变量
缓存与空值处理要显式
模型不自动缓存,也不自动兜底空数据,这两点接口里最容易忽略。
- 加缓存直接链cache():User::where('id', $id)->cache(3600)->find()(注意:count/sum等聚合方法不能接cache)
- 查不到时别直接访问属性,先判空:$user = User::find($id); if (!$user) { return json(['code'=>404, 'msg'=>'用户不存在']); } echo $user->name;
- 想统一返回空对象而非null?用findOrEmpty():$user = User::where('email', $email)->findOrEmpty(); if ($user->isEmpty()) { ... }



















