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
相关产品推荐
相关产品推荐

