我有通常的用户,组和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'获取与当前用户位于同一组中的用户的对象的方法?我不想要一个列表或数组,因为我想使用我的用户模型中定义的其他方法。
答案 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();