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

Laravel/Eloquent:如何筛选用户未被踢出的团队列表

解决方案

我来帮你搞定这个筛选逻辑!要获取当前用户未被踢出的团队,核心是利用Laravel的多对多关系查询能力,针对中间表的kicked字段做精准筛选。

情况1:仅保留用户已加入且未被踢出的团队

如果你的需求是只显示当前用户作为成员且未被踢出的团队,可以在if块中添加whereHas条件,通过wherePivot直接查询中间表字段:

$user = app('auth')->user();
if (isset($user)) {
    $teams->whereHas('users', function ($query) use ($user) {
        $query->where('users.id', $user->id)
              ->wherePivot('kicked', false);
    });
}

关键细节提醒:

  • whereHas:用于筛选存在指定关联关系的模型,这里就是筛选和当前用户有关联的团队。
  • wherePivot:Laravel专门为多对多中间表字段提供的查询方法,需要确保你的Team模型中users关系定义时,已经通过withPivot('kicked')声明了这个中间表字段,比如:
    // Team.php 模型文件
    public function users()
    {
        return $this->belongsToMany(User::class, 'teams_users')
                    ->withPivot('kicked');
    }
    

情况2:显示所有符合条件的团队(含用户未加入的团队)

如果你的需求是用户未加入的团队也能显示,同时排除用户被踢出的团队,可以用嵌套的where组合whereDoesntHave和orWhereHas:

$user = app('auth')->user();
if (isset($user)) {
    $teams->where(function ($query) use ($user) {
        // 筛选用户未加入的团队
        $query->whereDoesntHave('users', function ($q) use ($user) {
            $q->where('users.id', $user->id);
        })
        // 或者用户已加入且未被踢出的团队
        ->orWhereHas('users', function ($q) use ($user) {
            $q->where('users.id', $user->id)
              ->wherePivot('kicked', false);
        });
    });
}

这样就能完美匹配你的业务需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:30:00