使用PHP / CodeIgniter显示具有多对多关系的两个表的数据

时间:2012-03-30 03:55:11

标签: php sql codeigniter

我在两个表之间进行简单连接 - 首先一个名为users的用户具有字段:

  

|| id ||名称||

,第二个名为groups的表具有相同的字段:

  

|| 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'来获取任何组的用户。但我无法弄清楚的是如何让它同时显示 - 组的名称以及参与的用户。当我从表中创建和删除id变得非常无序时,我可能有20个组,而某些组可能有id = 53因此从1循环到number_of_groups的jsut不够好。有什么办法呢?

由于 Leron

2 个答案:

答案 0 :(得分:1)

只需选择组名,您只需要为字段名称添加别名:

$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" ');

答案 1 :(得分:1)

您无法在一个查询中获得该组以及该组中的用户。您可以在一个查询中获取每个组的连锁用户列表

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

组=> user是多对多关系,因此组中的用户将为用户返回多行。

如果您还需要用户详细信息列表,而不是连接表单。 您可以遍历组列表,然后将密钥添加到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

访问用户

请注意foreach循环中&之前的$g。由于foreach对传递的变量的副本进行操作,因此您已将引用传递给它。