ThinkPHP模型where查询需先确保模型继承think\Model,再按需拼条件;基础AND用数组传入最稳妥,OR或嵌套逻辑须用闭包,关联预加载带条件必须用闭包而非数组。

ThinkPHP模型用where查询,核心是先确保它是真正的模型,再按需拼条件——不是所有带where()的写法都安全有效。
确认模型类写法正确
如果调用User::where(...)->select()报错“Call to undefined method”,大概率是模型没继承think\Model。
- 检查
app\model\User.php开头是否有use think\Model;,类定义是否为class User extends Model - 若写了
use think\db\Query或根本没extends,那它只是个普通类,不支持链式查询 - TP6.1+ 推荐控制器中直接用
User::where(...)静态调用,不用(new User())->where(...)
基础AND条件:数组传入最稳妥
多个字段同时等于某值,用数组一次性传入比链式更清晰、不易漏判空值。
-
User::where(['status' => 1, 'type' => 'user'])->select()→ 生成WHERE status = 1 AND type = 'user' - 动态搜索时,先收集再过滤:
$where = [];,对每个参数做!empty()或isset() && strlen() > 0判断后再赋值 - 避免循环中反复
->where($k, $v),同字段多次调用会覆盖,不是叠加
含OR或嵌套逻辑:必须用闭包包裹
SQL里括号决定优先级,PHP里靠闭包来控制哪部分先组合。
- 简单OR:
User::where('status', 1)->whereOr('score', '>', 95)->select() - 复合条件如
(status=1 OR type='vip') AND deleted_at IS NULL,必须:User::where(function ($q) { $q->where('status', 1)->whereOr('type', 'vip'); })->whereNull('deleted_at')->select() - 多个独立OR组,就写多个闭包:
where(function(){...})->where(function(){...})
关联预加载带条件:with()必须配闭包
给with()加筛选条件,不能传数组,否则会解析失败或报“Relation not exists”。
- 错误:
with(['posts' => ['status' => 1]]) - 正确:
with(['posts' => function ($q) use ($status) { $q->where('status', $status); }]) - 多个关联不同条件,每个都要独立闭包,别共用同一个
$q变量
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











