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

Posted

技术标签:

【中文标题】使用 PHP/CodeIgniter 从具有多对多关系的两个表中显示数据【英文标题】:Displaying data from two tables with many-to-many relation using PHP/CodeIgniter 【发布时间】:2012-03-30 03:55:11 【问题描述】:

我正在两个表之间建立简单的连接 - 第一个名为 users 的表有字段:

||编号 ||姓名 ||

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

||编号 ||姓名 ||

它们之间的关系很复杂,因为一个用户可以在许多组(感兴趣的)中,并且一个组将包含多个用户。所以我有第三个表 user_group 字段:

||用户名 || 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 还不够好。这样做的方法是什么?

谢谢 勒隆

【问题讨论】:

您可能希望在一个(或两个)表中为name 列设置别名,以便可以直接从查询结果中访问组/用户名。见w3schools.com/sql/sql_alias.asp 我不认为 Alias 是这里的主要问题。您可以看到我的第一个查询 - 它带有别名,但看不到这如何帮助我显示我想要的信息。 【参考方案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

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

如果您还需要用户详细信息列表而不是串联形式。 您可以遍历组列表,然后将密钥添加到 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 对正在传递的变量的副本进行操作,因此您已经传递了对它的引用。

【讨论】:

【参考方案2】:

也只需选择组名,您只需为字段名称起别名:

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

【讨论】:

是的,这有点用。尽管如此,我并不想要确切的 id - 因为我想要所有组,所以它要么以某种方式循环组的 id,要么删除 WHERE 子句,但随后我得到了所有结果,我认为以这种方式过滤变得更加困难。跨度> 我不确定你在问什么。您是否希望每个组只计算属于该组的用户数? 不 - 计数会容易得多,这是一个真实的例子,所以你可以想象它 - 我想要一个页面,其中所有现有组的名称(钓鱼、跳伞、烹饪等) .) 显示在每个组的名称之后 - 参与人员的列表,而不仅仅是计数。我认为它不能只用 SQL 来完成,它需要某种过滤,但无法弄清楚到底在哪里做。

以上是关于使用 PHP/CodeIgniter 从具有多对多关系的两个表中显示数据的主要内容,如果未能解决你的问题,请参考以下文章

从具有多对多关系核心数据iOS的上下文中删除nsmanagedboject

在asp.net mvc中从具有多对多关系的数据库中获取记录

填充具有访问权限的多对多表

具有额外多对多关系的 JPA 多对多

通过 HTTP 导入核心数据,具有多对多关系

PostGraphile deleteEdge 具有多对多关系