Laravel получает все группы вместе с количеством членов каждой группы, используя запрос соединения - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть две таблицы 'Group' ('id', 'title', 'description') и 'Group_members' ('id', 'group_id', 'user_id').Когда пользователь присоединяется к группе, в таблице 'group_members' создается строка.

Мне нужно выбрать все группы вместе с количеством участников в каждой группе, например: -

[
    {
        id: 1
        title: group1
        description: lorem ipsum
        member_count: 5
    }{
        id: 2
        title: group2
        description: lorem ipsum
        member_count: 7
    }
]

То, что я до сих пор делал, это

    DB::table('group')
        ->join('group_members', 
        function($join){
            $join->on('group_members.group_id', '=', 'group.id')
            ->distinct()->pluck('group_members.user_id')->count();
        })
        ->get();

, который возвращает ошибку

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в вашем SQLсинтаксис;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'на group. id = group_members .`group_id

Пожалуйста, помогите

1 Ответ

0 голосов
/ 18 ноября 2018

Если вы настроили свои отношения в модели вашей группы, например

public function group_members()
{
    return $this->hasMany('App\GroupMember');
}

и в модели GroupMember, как

public function group()
{
    return $this->belongsTo('App\Group');
}

Вы должны быть в состоянии сделать

$groups = Group::all();

foreach ($groups as $group) {
    $group->member_count = $group->group_members()->count();
}

$groupsArray = $groups->toArray();

Или

$group = Group::where('column', 'value')->with('group_members')->first();
$count = $group->group_members->count();

Читайте Отношения и Коллекции в документах


Вы также можете использовать mutatus / accessor, чтобы возвращать количество участников как свойство модели, так и в модели вашей группы

getGroupMemberCountAttribute() {
    return $this->group_members()->count();
}

И используйте это как

$group->group_member_count;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...