Laravel / Eloquent:数据透视表上的条件

时间:2018-04-09 22:46:47

标签: laravel eloquent laravel-5.5

我有3个桌子'用户','团队'和' teams_users' (数据透视表)。数据透视表包含一个布尔字段' kicked'。我没有找到获得用户未被踢过的团队列表的方法。我的代码如下所示:

$teams = Team::withCount('users')
               ->where($params)
               ->orderBy(DB::raw('users_count / max_members'), 'desc')
               ->orderBy('team_id', 'desc')
               ->has('users', '<', DB::raw('max_members'));

$user = app('auth')->user();
if (isset($user)) {
    // Here add the condition to exclude teams the user has been kicked from
}

2 个答案:

答案 0 :(得分:1)

首先,按照惯例,您的数据透视表应命名为team_user,并且包含team_id和user_id列(当然,它也可以有额外的内容)。

接下来,如果还没有,你应该在模型中建立你的关系。使用User模型中的belongsToMany()关系可以获取此类团队

$user->teams

然后你就可以这么做了

$user->teams()->where('kicked', false)->get()

有关此处关系的更多详细信息https://laravel.com/docs/5.6/eloquent-relationships(有关数据透视表,请参阅多对多)

答案 1 :(得分:1)

挖掘文档,我发现了这个:

if (isset($user)) {
    $teams->whereDoesntHave('users', function ($query) use ($user) {
        $query->where("is_kicked", "=", '1')
              ->where('teams_users.user_id', '=', $user->id);
    });
}

它会产生一个“不存在”。 SQL查询中的条件。 效果很好!