Я делаю простую связь между двумя таблицами – во-первых, у пользователей есть поля:
|| 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" ');