Laravel中如何用Eloquent查询所有成员均已投票的群组ID
首先确认模型关联已正确定义:
Group模型关联:
// Group.php use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; class Group extends Model { // 和用户的多对多关联 public function users(): BelongsToMany { return $this->belongsToMany(User::class); } // 和投票记录的一对多关联 public function slotVotes(): HasMany { return $this->hasMany(SlotVote::class); } }
实现查询的最优方案
核心逻辑是判断「群组总成员数」等于「该群组下已投票的去重用户数」,一次查询即可完成,性能最优:
use Illuminate\Support\Facades\DB; // 获取所有全员已投票的群组 $fullyVotedGroups = Group::select('groups.*') ->withCount('users as total_member_count') ->withCount(['slotVotes as voted_member_count' => function ($query) { $query->select(DB::raw('COUNT(DISTINCT user_id)')); }]) ->havingRaw('total_member_count = voted_member_count') ->get(); // 仅需要群组ID的话追加pluck $fullyVotedGroupIds = $fullyVotedGroups->pluck('id');
原写法的问题说明
- 你无法在
whereHas的闭包中直接获取外层$groupId,是因为闭包作用域默认不会传入外层Group的主键,需要额外处理但性能极低 - 原写法会为每一个Group执行一次独立的投票用户查询,数据量稍大就会出现严重的N+1性能问题,不推荐使用。
内容的提问来源于stack exchange,提问作者work sarah
相关产品推荐
相关产品推荐

