У меня есть обычные пользователи, группы и таблицы 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;
где? заменяется текущим идентификатором пользователя.
но я хочу использовать Eloquent (за пределами laravel) для этого. Я попытался использовать модель User с методом групп
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);
}
}
Тогда, на мой взгляд, я просматриваю своих пользователей в обычном режиме. Хотя этот метод работает, он не будет очень эффективным, поскольку я не могу решить, как использовать Eager Loading с ним.
Существует ли более простой способ "Доброго" получить объект пользователей, которые находятся в той же группе, что и текущий пользователь? Я не хочу просто хотеть список или массив, поскольку я хочу использовать другие методы, определенные в моей модели пользователя.
Я смог построить следующий запрос 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();
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()
Для получения дополнительной информации проверьте раздел " Ребенок " на документации.
Если пользователь принадлежит какой-либо группе
$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);
SQL
where
пункт, если слишком сложный. Просто напишите,where users.user_id = ?
, Из-за вашегоinner join
состоянияinner join
это дает те же результаты. Это также облегчит реализацию Eloquent.