Красноречивые пользователи в той же группе

1

У меня есть обычные пользователи, группы и таблицы 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 с ним.

Существует ли более простой способ "Доброго" получить объект пользователей, которые находятся в той же группе, что и текущий пользователь? Я не хочу просто хотеть список или массив, поскольку я хочу использовать другие методы, определенные в моей модели пользователя.

  • 0
    Немного не по теме, но ваш SQL where пункт, если слишком сложный. Просто напишите, where users.user_id = ? , Из-за вашего inner join состояния inner join это дает те же результаты. Это также облегчит реализацию Eloquent.
  • 0
    Я попробовал это, но я не вижу, насколько они эквивалентны, так как я пытаюсь найти пользователей в тех же группах, что и текущий пользователь, которые могут принадлежать ко многим группам.
Показать ещё 3 комментария
Теги:
eloquent

2 ответа

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();
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()

Для получения дополнительной информации проверьте раздел " Ребенок " на документации.

Обновить:

Если пользователь принадлежит какой-либо группе

$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);
  • 0
    Что мне здесь не хватает? Если я перебираю каждую группу, мне нужно проверить, находится ли мой текущий пользователь в этой группе, тогда мне нужно получить всех остальных пользователей этой группы. Так что я мог бы сделать foreach для ($ groupWithUsers-> all () как $ thisGroup), но тогда мне все еще нужно сделать что-то вроде if ($ thisGroup-> where ('user_id', '=', $ currentUserId) -> get ()) чтобы проверить, принадлежит ли эта группа моему текущему пользователю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню