如何筛选拥有偶数个hasMany关联记录的User模型?
实现方案说明
首先解答你的疑问:不能直接用whereHas结合%2取余实现需求
whereHas()方法的核心作用是筛选「存在符合条件的关联记录」的父模型,它的闭包参数是用于过滤单条关联记录的,无法直接对关联的总数量做取余判断。
推荐实现方案(性能最优,SQL层面直接过滤)
使用 withCount() 搭配 havingRaw() 实现,这个方案是Laravel生态通用的关联计数筛选方案:
假设你的User模型定义的hasMany关联名为posts(替换成你自己的实际关联名即可),代码如下:
User::withCount('posts') // 直接对关联计数做奇偶判断,等于0对应偶数 ->havingRaw('posts_count % 2 = 0') ->get();
- 说明:
withCount('关联名')会自动给查询结果附加一个{关联名}_count的字段,存储该用户对应的关联记录总数,再通过havingRaw执行取余运算筛选出总数为偶数的记录即可。
替代方案(仅适合小数据量场景)
如果你的数据量很小,也可以先查询出所有用户的关联计数,再通过集合在PHP层面过滤:
$users = User::withCount('posts') ->get() ->filter(fn ($user) => $user->posts_count % 2 === 0);
- 该方案会先查询出所有用户的关联计数再过滤,数据量大时会有严重性能问题,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者Patrycja
相关产品推荐
相关产品推荐

