首页 > php框架 > Laravel > 正文

Laravel如何使用Eloquent进行子查询

尼克
发布: 2025-12-01 10:17:06
原创
942人浏览过
Laravel Eloquent支持子查询,可通过addSelect获取用户最新订单时间,where条件中嵌套查询筛选订单总额超1000的用户,joinSub将子查询结果作为临时表连接,或使用withSum等快捷方法预加载聚合数据,提升复杂查询可读性与效率。

laravel如何使用eloquent进行子查询

在 Laravel 中,Eloquent 支持通过子查询(Subquery)来实现更复杂的查询逻辑。你可以将一个查询的结果作为另一个查询的字段或条件使用,尤其适用于获取关联数据中的最新记录、统计值等场景。下面介绍几种常见的使用方式。

在 SELECT 中使用子查询

如果你想在查询结果中包含一个来自子查询的字段,比如获取每个用户的最后一条订单信息,可以这样做:

假设你有 User 模型和 Order 模型,你想查出每个用户的名字和他们最近订单的创建时间。

use Illuminate\Database\Eloquent\Builder;

$users = User::select('users.*')
    ->addSelect(['last_order_at' => Order::select('created_at')
        ->whereColumn('user_id', 'users.id')
        ->orderByDesc('created_at')
        ->limit(1)
    ])
    ->get();
登录后复制

这里使用了 addSelect() 添加一个子查询字段,该子查询获取当前用户最新的订单时间。

在 WHERE 条件中使用子查询

你可以用子查询作为 WHERE 的判断条件。例如:找出订单总额超过 1000 的用户。

$totalQuery = Order::selectRaw('sum(amount)')
    ->whereColumn('user_id', 'users.id');

$users = User::whereHas('orders')
    ->where(function (Builder $query) use ($totalQuery) {
        $query->select($totalQuery)->from('orders')->limit(1)->shouldAllowSelfJoins()
    }, '>', 1000)
    ->get();
登录后复制

也可以更简洁地写成:

Android编程之Bundle及Server、布局等教程 PDF版
Android编程之Bundle及Server、布局等教程 PDF版

内容:使用Bundle在Activity间传递数据、Log与DDMS(查看Log等信息)、Activity生命周期、Android应用开发4使用Service、如何使用服务、服务生命周期、进程生命周期、使用服务进行音乐播放、AndroidUI布局等……

Android编程之Bundle及Server、布局等教程 PDF版 0
查看详情 Android编程之Bundle及Server、布局等教程 PDF版
$users = User::whereExists(function ($query) {
    $query->select(DB::raw(1))
          ->from('orders')
          ->whereColumn('orders.user_id', 'users.id')
          ->havingRaw('sum(amount) > 1000')
          ->groupBy('orders.user_id');
})->get();
登录后复制

在 JOIN 中使用子查询

有时你需要将子查询作为一个临时表进行 JOIN。例如获取每个用户的最新一条订单。

$latestOrderSubquery = Order::select('user_id', DB::raw('max(created_at) as last_order_at'))
    ->groupBy('user_id');

$users = User::joinSub($latestOrderSubquery, 'latest_orders', function ($join) {
    $join->on('users.id', '=', 'latest_orders.user_id');
})->get();
登录后复制

joinSub() 方法允许你把一个查询当作一个子查询表来 JOIN,非常适用于聚合或去重场景。

使用 withSum、withMax 等快捷方法(Laravel 8+)

Laravel 提供了一些便捷的预加载子查询方法,如 withSumwithMaxwithAvg 等。

// 获取用户及其订单总金额
$users = User::withSum('orders as total_spent', 'amount')->get();

foreach ($users as $user) {
    echo $user->total_spent; // 直接访问
}
登录后复制

这种方式比手动写子查询更清晰,适合简单的聚合场景。

基本上就这些。Laravel 的 Eloquent 子查询功能强大且灵活,合理使用能让复杂查询变得简洁易懂。关键在于理解何时使用 selectSubjoinSub 或内置的 withXxx 方法。不复杂但容易忽略细节,比如别名定义和作用域绑定。

以上就是Laravel如何使用Eloquent进行子查询的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号