如何使用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
相关产品推荐
相关产品推荐

