Отображение данных из двух таблиц с отношением «многие ко многим» с использованием PHP / CodeIgniter

Я делаю простую связь между двумя таблицами – во-первых, у пользователей есть поля:

|| id || имя ||

а вторая таблица, называемая группами, имеет те же поля:

|| id || имя ||

Отношения b / w их очень много, потому что один пользователь может быть во многих группах (представляющих интерес), и группа будет содержать более одного пользователя. Итак, у меня есть третья таблица user_group с полями:

|| user_id || group_id ||

Там, где оба являются foregin keys, для пользователей и для групп.

Цель состоит в том, чтобы составить список со всеми группами и людьми, участвующими в каждом из них. Для этого я сделал свой запрос:

$q = $this->db->query('SELECT u.name FROM users u JOIN user_group ug ON u.id = ug.user_id JOIN groups g ON g.id = ug.group_id WHERE ug.group_id = "4" '); 

затем изменил его с помощью активных записей:

 $this->db->select('users.name'); $this->db->from('users'); $this->db->join('user_group', 'user_group.user_id = users.id'); $this->db->join('groups', 'groups.id = user_group.group_id'); $this->db->where('user_group.group_id', 3); $q = $this->db->get(); 

И таким образом я могу взять пользователей для любой группы, указав «id» из таблицы групп. Но то, что я не могу понять, заключается в том, как отобразить их как – название группы вместе с участвующими пользователями. Когда я создаю и удаляю из таблиц, идентификатор становится очень неупорядоченным, у меня может быть 20 групп, а у некоторой группы может быть id = 53, поэтому jsut looping от 1 до number_of_groups недостаточно хорош. Каков способ сделать это?

Благодаря Leron

Вы не можете получить группу, а также пользователей из этой группы в одном запросе. Вы можете получить список объединенных пользователей для каждой группы в одном запросе

 SELECT g.group_name, GROUP_CONCAT(u.fullname) FROM group g JOIN user_group ug ON g.id = ug.id JOIN user u ON ug.user_id = u.id GROUP BY g.id 

Группа => пользователь имеет отношение Many to Many, поэтому пользователь в группе возвращает несколько строк для пользователей.

Если вам нужен также список деталей пользователя, а не конкатенированная форма. Вы можете перебирать список групп, а затем добавлять к ним ключ.

 $groups = $this->db->get('groups')->result(); foreach($group as &$g){ $this->db->select('users.name'); $this->db->from('users'); $this->db->join('user_group', 'user_group.user_id = users.id'); $this->db->where('user_group.group_id', $g->id); $g->users = $this->db->get()->result(); } 

Теперь вы переходите через $group и можете получить доступ к пользователям с помощью $group->users

Обратите внимание, что & перед $g в цикле foreach. Поскольку foreach работает над копией передаваемой переменной, вы передаете ссылку на нее.

Просто выберите имя группы, просто нужно указать имя поля:

 $q = $this->db->query('SELECT u.name, g.name AS `group_name` FROM users u JOIN user_group ug ON u.id = ug.user_id JOIN groups g ON g.id = ug.group_id WHERE ug.group_id = "4" ');