Laravel中如何实现关联查询获取最大值字段?
- 内容介绍
- 文章标签
- 相关推荐
本文共计929个文字,预计阅读时间需要4分钟。
直接说结论:
用 ofMany() 获取关联中最大值对应的一条记录
这是 Laravel 原生支持的“一对多取一”关系语法,专为这类需求设计。它底层会生成带窗口函数(如 ROW_NUMBER())或子查询的 SQL,但你不用手写。
- 必须确保关联字段(如
version、created_at)在数据库中有索引,否则性能会明显下降 - 只适用于 Eloquent 模型关系定义,不能用于查询构建器(
DB::table()) - 默认行为是取最大值;若要最小值,把
'max'改成'min'
示例(获取每个 product 对应的最高 price 的 variant):
// Product.php public function highestPricedVariant() { return $this->hasOne(Variant::class)->ofMany('price', 'max'); }
调用时:Product::with('highestPricedVariant')->get(),结果中每个 Product 都附带其价格最高的那个 Variant 实例。
子查询方式:兼容所有 Laravel 版本 + 所有数据库
当你需要跨版本兼容,或关联逻辑不能用模型关系表达(比如临时查、非标准外键),子查询是最稳的选择。
本文共计929个文字,预计阅读时间需要4分钟。
直接说结论:
用 ofMany() 获取关联中最大值对应的一条记录
这是 Laravel 原生支持的“一对多取一”关系语法,专为这类需求设计。它底层会生成带窗口函数(如 ROW_NUMBER())或子查询的 SQL,但你不用手写。
- 必须确保关联字段(如
version、created_at)在数据库中有索引,否则性能会明显下降 - 只适用于 Eloquent 模型关系定义,不能用于查询构建器(
DB::table()) - 默认行为是取最大值;若要最小值,把
'max'改成'min'
示例(获取每个 product 对应的最高 price 的 variant):
// Product.php public function highestPricedVariant() { return $this->hasOne(Variant::class)->ofMany('price', 'max'); }
调用时:Product::with('highestPricedVariant')->get(),结果中每个 Product 都附带其价格最高的那个 Variant 实例。
子查询方式:兼容所有 Laravel 版本 + 所有数据库
当你需要跨版本兼容,或关联逻辑不能用模型关系表达(比如临时查、非标准外键),子查询是最稳的选择。

