Laravel如何使用Eloquent进行子查询
发布时间 - 2025-12-01 00:00:00 点击率:次Laravel Eloquent支持子查询,可通过addSelect获取用户最新订单时间,where条件中嵌套查询筛选订单总额超1000的用户,joinSub将子查询结果作为临时表连接,或使用withSum等快捷方法预加载聚合数据,提升复杂查询可读性与效率。
在 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();
也可以更简洁地写成:
$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 提供了一些便捷的预加载子查询方法,如 withSum、withMax、withAvg 等。
// 获取用户及其订单总金额
$users = User::withSum('orders as total_spent', 'amount')->get();
foreach ($users as $user) {
echo $user->total_spent; // 直接访问
}
这种方式比手动写子查询更清晰,适合简单的聚合场景。
基本上就这些。Laravel 的 Eloquent 子查询功能强大且灵活,合理使用能让复杂查询变得简洁易懂。关键在于理解何时使用 selectSub、joinSub 或内置的 withXxx 方法。不复杂但容易忽略细节,比如别名定义和作用域绑定。
# laravel
# 作用域
# select
# 适用于
# 你想
# 查询结果
# 加载
# 你可以
# 可以用
# 你有
# 能让
# 这样做
# 几种
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
进行网站优化必须要坚持的四大原则
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
南京网站制作费用,南京远驱官方网站?
如何在香港免费服务器上快速搭建网站?
linux写shell需要注意的问题(必看)
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
canvas 画布在主流浏览器中的尺寸限制详细介绍
EditPlus中的正则表达式 实战(4)
青岛网站建设如何选择本地服务器?
网站建设整体流程解析,建站其实很容易!
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
详解Android图表 MPAndroidChart折线图
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
文字头像制作网站推荐软件,醒图能自动配文字吗?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
5种Android数据存储方式汇总
如何用搬瓦工VPS快速搭建个人网站?
Laravel定时任务怎么设置_Laravel Crontab调度器配置
如何在阿里云虚拟服务器快速搭建网站?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
使用豆包 AI 辅助进行简单网页 HTML 结构设计
Python进程池调度策略_任务分发说明【指导】
java获取注册ip实例
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何在万网ECS上快速搭建专属网站?
Python文件异常处理策略_健壮性说明【指导】
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何在IIS中新建站点并解决端口绑定冲突?
百度浏览器如何管理插件 百度浏览器插件管理方法
如何在阿里云虚拟主机上快速搭建个人网站?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
如何挑选高效建站主机与优质域名?
利用vue写todolist单页应用
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
LinuxCD持续部署教程_自动发布与回滚机制
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】


)
->get();