Laravel怎么使用查询构造器(Query Builder)执行复杂查询

31次阅读

laravel查询构造器支持多条件嵌套、联表查询、子查询、分组聚合及排序分页。1. 使用 where 和 闭包 实现(status = ‘active’ AND (score > 80 OR type = ‘vip’));2. leftJoin 关联用户与订单表,包含无订单用户;3. joinSub 实现子查询获取每个用户最新订单;4. groupBy 结合 having 筛选订单总额超 500 的用户;5. distinct 去重并按评分降序取前 10 活跃用户。

Laravel 怎么使用查询构造器 (Query Builder) 执行复杂查询

Laravel 的查询构造器(Query Builder)是一个强大的 工具 ,能够帮助你在不写原生 sql 的情况下执行复杂的 数据库 操作。它提供了链式调用语法,让你可以灵活地构建 select、INSERT、UPDATE、delete 等语句,同时防止 SQL 注入。

1. 多条件查询与嵌套 where

在实际开发中,经常需要组合多个条件进行筛选。你可以使用 whereorWhere 和闭包来实现嵌套条件。

  • 使用闭包组织“括号内的逻辑”,比如 (status = ‘active’ AND score> 80) OR (type = ‘vip’)
  • 示例代码:

$users = DB::table('users')<br>    ->where('status', 'active')<br>    ->where(function ($query) {<br>        $query->where('score', '>', 80)<br>              ->orWhere('type', 'vip');<br>    })<br>    ->get();

这会生成类似:WHERE status = 'active' AND (score > 80 OR type = 'vip')

2. 联表查询(JOIN)

当你需要从多个表中获取数据时,可以用 join 方法。Laravel 支持内连接、左连接、右连接等。

  • leftJoin 常用于可选关联数据(如统计用户订单数)
  • 支持 on 和多条件 using
  • 示例:获取用户及其订单信息

$users = DB::table('users')<br>    ->select('users.*', 'orders.amount', 'orders.created_at as order_date')<br>    ->leftJoin('orders', 'users.id', '=', 'orders.user_id')<br>    ->where('orders.amount', '>', 100)<br>    ->orWhereNull('orders.id') // 包含无订单的用户 <br>    ->get();

3. 子查询支持(from 子查询和 select 子查询)

Laravel 允许你将一个查询作为子查询使用,适用于分页后统计、最新记录筛选等场景。

  • 使用 from(DB::raw(“(…) as alias”)) 实现 from 子查询
  • 在 select 中使用子查询需借助 DB::raw 或高级子查询语法

例如:获取每个用户的最新一条订单

$latestOrders = DB::table('orders')<br>    ->selectRaw('user_id, MAX(created_at) as max_date')<br>    ->groupBy('user_id');<br><br>$result = DB::table('users')<br>    ->joinSub($latestOrders, 'latest', function ($join) {<br>        $join->on('users.id', '=', 'latest.user_id');<br>    })<br>    ->join('orders', function ($join) {<br>        $join->on('users.id', '=', 'orders.user_id')<br>              ->on('orders.created_at', '=', 'latest.max_date');<br>    })<br>    ->select('users.name', 'orders.amount')<br>    ->get();

Laravel 怎么使用查询构造器 (Query Builder) 执行复杂查询

蓝心千询

蓝心千询是 vivo 推出的一个多功能 AI 智能助手

Laravel 怎么使用查询构造器 (Query Builder) 执行复杂查询 34

查看详情 Laravel 怎么使用查询构造器 (Query Builder) 执行复杂查询

4. 分组与 聚合函数 结合 having

当你要对 groupBy 的结果做条件过滤时,不能用 where,而要用 having

  • 常用 聚合函数count、sum、avg、max、min
  • having 用于过滤分组后的数据

示例:找出订单总额超过 500 的用户

$highSpenders = DB::table('orders')<br>    ->select('user_id', DB::raw('SUM(amount) as total'))<br>    ->groupBy('user_id')<br>    ->having('total', '>', 500)<br>    ->get();

5. 排序、分页与去重

复杂查询通常还需要控制输出顺序和数量。

  • orderBy 支持多字段排序
  • limit / takeoffset / skip 控制分页
  • distinct 去除重复记录

示例:按评分降序取前 10 个不同城市的活跃用户

$users = DB::table('users')<br>    ->select('city', 'name', 'score')<br>    ->where('status', 'active')<br>    ->distinct()<br>    ->orderBy('score', 'desc')<br>    ->take(10)<br>    ->get();

基本上就这些。Query Builder 在保持简洁的同时足够强大,适合大多数业务场景下的复杂查询需求。只要合理组合方法,就能写出高效又安全的数据库操作代码。

站长
版权声明:本站原创文章,由 站长 2025-11-11发表,共计2270字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources