同组中的雄辩用户

时间:2015-11-08 10:52:12

标签: php eloquent

我有通常的用户,组和group_user表。我知道我想要的原始SQL:

SELECT group_user.group_id, users.* FROM users
INNER JOIN group_user ON users.id = group_user.user_id
WHERE group_user.group_id IN
(SELECT group_id FROM group_user WHERE user_id=?)
ORDER BY group_user.group_id;

在哪里?被替换为当前用户的ID。

但是,我想使用Eloquent(在laravel之外)。我尝试使用带有组方法的用户模型

public function groups() {
    return $this->belongsToMany('\Smawt\User\Group');
}

以及带有用户方法的成员资格模型

public function users($group_id) {
    return $this->where('group_id', '=', $group_id)->get();
}

然后我循环遍历组,然后循环遍历其所有成员。最后,我追加所有数据以在最后获得一个$ users对象,以传递给我的视图。

$thisMembership = new Membership;
$myGroups = $app->auth->groups;

$users = [];

foreach ($myGroups as $myGroup) {

    foreach ($thisMembership->users($myGroup->id) as $myUser) {

        $thisUser = $app->user->where('id', '=', $myUser->user_id)->first();
        $thisUser->group_id = $myGroup->id;

        array_push($users, $thisUser);
    }
}

然后在我看来,我正常循环访问我的$ users。虽然这种方法有效,但效率不高,因为我无法弄清楚如何使用Eager Loading。

是否有一个更简单的“Eloquent'获取与当前用户位于同一组中的用户的对象的方法?我不想要一个列表或数组,因为我想使用我的用户模型中定义的其他方法。

2 个答案:

答案 0 :(得分:0)

关系和使用它的Eloquent方式:

Tables: users, groups
Models: User   Group 
Pivot Table: group_user (id, user_id, group_id)

在用户模型中:

public function groups()
{
    // pivot table name and related field
    // names are optional here in this case
    return $this->belongsToMany('Group');
}

在群组模型中:

public function users()
{
    // pivot table name and related field
    // names are optional here in this case
    return $this->belongsToMany('User');
}

用例(示例):

$usersWithGroup = User::with('groups')->find(1); // or get()
$groupWithUsers = Group::with('users')->find(1); // or get()

有关详细信息,请查看文档中的Eloquent部分。

更新

如果用户属于任何群组

$usersWithGroup = User::has('groups')->with('groups')->find(1);

如果用户属于特定组,也使用

$someGroup = 'general';
$usersWithGroup = User::whereHas('groups', function($q) use($someGroup) {
    $q->where('group_name', $someGroup);
})
->with('groups')->find(1);

答案 1 :(得分:0)

我已经能够构建以下Eloquent查询,但我不确定这是“最佳”方式:

$users = User::join('group_user', 'users.id', '=', 'group_user.user_id')
        ->whereIn('group_user.group_id', function($query) {
            $query->select('group_id')
                  ->from('group_user')
                  ->where('group_user.user_id', '=', $_SESSION['user_id']);
        })->orderBy('group_id', 'asc')
        ->get();