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


Displaying data from two tables with many-to-many relation using PHP/CodeIgniter

我正在两个表之间进行简单的连接-第一个被称为users的表有字段:

||id ||名称||

第二个称为组的表具有相同的字段:

||id ||名称||

它们之间的关系是多方面的,因为一个用户可以在多个组中(感兴趣的),并且一个组将包含多个用户。因此,我有了第三个带有字段的表user_group:

||user_id || group_id ||

其中两个都是foregin键,一个用于用户,另一个用于组。

目标是列出所有小组和每个小组的参与者。为此,我提出了我的疑问:

$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

不能在一个查询中获取组以及该组中的用户。您可以在一个查询中获得每个组的串联用户列表

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 访问用户

请注意,在foreach循环中,&位于$g之前。由于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" ');