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

Laravel中如何用Eloquent查询所有成员均已投票的群组ID

首先确认模型关联已正确定义:

  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:36:04