查不到数据八成是忘了调用get()、first()等终止方法;子查询须用fromsub()/joinsub()传构造器实例,禁用db::raw()字符串;动态条件必须用when()/unless(),whereraw/selectraw须用?占位符防注入。

get()、first() 或其他终止方法——查询构建器本身不执行 SQL,它只组装语句。
查不到数据时先确认是否调用了终止方法
DB::table('users') 返回的是一个 Builder 实例,不是结果。任何链式调用(where()、orderBy()、select())都只是配置查询,直到你调用 get()、first()、value()、exists() 等才会真正发请求。
- 错误写法:
DB::table('users')->where('id', 1);—— 没有返回值,也不报错,但什么都没发生 - 正确写法:
DB::table('users')->where('id', 1)->first();或DB::table('users')->where('id', 1)->value('name'); - 聚合场景别用
get()->count(),直接上count(),避免把整张表拉进内存
动态条件必须用 when(),别手写 if 判断追加 where
手动在 if 块里调用 $query->where(...) 容易漏掉变量作用域、闭包捕获异常,或因条件顺序错乱导致 SQL 逻辑错误。Laravel 的 when() 是专为这个设计的声明式方案。
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
-
when()第一个参数为 truthy 时才执行回调,天然支持链式;unless()是反向逻辑 - 回调函数接收 builder 实例,必须 return 它(不是 new 实例),否则链路中断
- 示例:
DB::table('posts')->when(request('q'), fn($q, $v) => $q->where('title', 'like', "%{$v}%"))->get(); - 多个条件可连续
when(),不会相互污染
子查询不能直接传 DB::raw() 字符串
像 DB::table(DB::raw('(SELECT ...) as t')) 这种写法在 Laravel 10+ 会出问题:参数无法绑定、别名解析失败、SQL 编译异常。子查询必须作为完整 builder 实例传入。
- FROM 子句用
fromSub(),第二个参数是别名:fromSub($subQuery, 'latest') - JOIN 子句用
joinSub(),第三个参数是 on 闭包:joinSub($sub, 'top', fn($j) => $j->on('u.id', '=', 'top.user_id')) - WHERE 中子查询用闭包:
where('amount', '>', function ($q) { $q->selectRaw('AVG(amount)')->from('orders as o2')->whereColumn('o2.user_id', 'orders.user_id'); }) - 子查询内部不能直接引用外部字段名,要用
whereColumn()或显式 alias 对齐
原生表达式必须用 ? 占位符防注入
selectRaw() 和 whereRaw() 能干很多内置方法做不到的事(比如 MySQL 的 JSON_EXTRACT、PostgreSQL 的窗口函数),但一旦拼字符串就等于打开 SQL 注入大门。
- 错误:
whereRaw("status = '{$status}'")—— 变量直插,高危 - 正确:
whereRaw('status = ?', [$status])或whereRaw('status = ? AND created_at > ?', [$status, $date]) - 复杂表达式也一样:
selectRaw('DATE_SUB(?, INTERVAL ? DAY) as cutoff', [$now, $days]) - 如果真要拼表名/字段名(极少见),必须白名单校验,不能依赖用户输入
with()、load() 或模型访问器时,得切回 Eloquent;而当你面对千万级日志表做聚合统计,或需要精确控制 JOIN 顺序和索引提示时,构建器才是更可控的选择。










