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

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

|| id || имя ||

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

|| id || имя ||

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

|| user_id || group_id ||

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

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

$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 от 1 до number_of_groups недостаточно хорош. Как это сделать?

Спасибо Лерон

Ответы [ 2 ]

1 голос
/ 30 марта 2012

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

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

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

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

$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 работает с копией передаваемой переменной, вы передаете ссылку на нее.

1 голос
/ 30 марта 2012

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

$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" ');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...