You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用with()获取Laravel关联模型的字段最小值?

解决方案

问题根源

你之前用with()的方式不对——with()是用来预加载完整的关联模型集合的,闭包里的min('created_at')并不会返回聚合值,反而会让Eloquent尝试返回符合聚合条件的posts模型,所以才会拿到全部关联数据。


方法一:用withAggregate(Laravel 8+ 推荐)

Laravel 8及以上版本提供了withAggregate方法,专门用来获取关联模型的聚合值,不需要加载整个关联模型,代码简洁高效:

$users = User::has('posts') // 仅筛选出拥有posts关联的用户
    ->withAggregate('posts', 'created_at', 'min')
    ->get();

获取结果时,每个用户对象会多出一个posts_created_at_min属性,直接调用即可拿到该用户最早的文章创建时间:

foreach ($users as $user) {
    echo $user->name . ' 的第一篇文章创建时间:' . $user->posts_created_at_min;
}

方法二:关联查询+分组聚合(兼容旧版本)

如果你的Laravel版本低于8,可以用join结合分组聚合来实现:

use Illuminate\Support\Facades\DB;

$users = User::select('users.*', DB::raw('MIN(posts.created_at) as earliest_post_at'))
    ->join('posts', 'users.id', '=', 'posts.user_id')
    ->groupBy('users.id')
    ->get();

此时每个用户对象会有earliest_post_at属性,对应其最早的文章创建时间。

注意:如果MySQL开启了严格模式,可能需要将users表的所有字段都加入groupBy,或者在config/database.php中暂时关闭strict配置(不推荐长期关闭)。

内容的提问来源于stack exchange,提问作者Mohsen behroozi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:33:19