使用 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