我在mysql中使用多个表非常新,所以我真的不明白一些事情......
这是我的role.model.php
中的PHP代码。
public function getRolePerms($role_id) {
$str = "SELECT t2.perm_desc FROM role_perm as t1
JOIN permissions as t2 ON t1.perm_id = t2.perm_id
WHERE t1.role_id = :role_id";
$sth = $this->db->prepare($str);
$sth->execute(array(':role_id' => $role_id));
$data = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($data);
}
我在我的role.php
控制器中调用了它,并输入了一个1的虚拟$role_id
; getRolePerms(1);
我print_r($data)
所以我会知道它是否会获取数据,但输出只是
“阵列()”
我的问题是,这是如何运作的?
如果我有这些表:
roles
permissions
role_perms
包含role_id
和perm_id
列,引用角色和权限的主键。
答案 0 :(得分:3)
您是否检查过role_perms
表是否有role_id
为1的行?因为查询应该有效。
首先,尝试了解表格及其关系。我想你的表有点像下表。
ROLE 表包含应用中的角色(例如管理员,访客)。
Table 1: ROLE
-----------------------------------------------
role_id role_description
-----------------------------------------------
1 Admin
2 Guest
PERMISSIONS 表包含应用程序中的权限。
Table 2: PERMISSIONS
-----------------------------------------------
permission_id permission_description
-----------------------------------------------
1 Can create files
2 Can edit files
3 Can view files
ROLE_PERMISSIONS 表包含应用程序中不同角色的权限。以下面的数据为例,它意味着角色1(管理员)具有权限1,2和3(可以分别创建,编辑和查看文件)。
Table 3: ROLE_PERMISSIONS
-----------------------------------------------
role_id permission_id
-----------------------------------------------
1 1
1 2
1 3
2 3
现在,尝试理解查询。
SELECT t2.permission_description
FROM role_permissions as t1 JOIN permissions as t2
ON t1.permission_id = t2.permission_id
WHERE t1.role_id = 1
第一行指示应检索哪些数据。它表示要从列t2
中的表permission_description
中选择值。因此,查询的可能结果是:
可以创建文件
可以编辑文件
可以查看文件
第二个&第三行指示来自其中数据应该被检索。它说要从role_permissions
和permissions
ON
的联合表中检索数据:
t1.permission_id = t2.permission_id
注意: AS
表示将使用别名。含义, t1
与 role_permissions
相同。
从上面的 PERMISSIONS 和 ROLE_PERMISSIONS 表中,联合表格如下所示。
Table 4: Joint ROLE_PERMISSIONS and PERMISSIONS
------------------------------------------------------------------------
role_id permission_id permission_id permission_description
------------------------------------------------------------------------
1 1 1 Can create files
1 2 2 Can edit files
1 3 3 Can view files
2 3 3 Can view files
这是将检索数据的表格。
到目前为止,该指令是从联合表中检索permission_description
(表4 )。
第四行为第一条指令添加约束,仅选择permission_description
s WHERE
role_id = 1
。因此,完整的指令是
从联合表中检索
permission_description
(表4 )role_id
为1的地方。
用简单的英语表示:
检索角色' Admin'。
的权限说明
因此查询的结果是:
Table 5: PERMISSION_DESCRIPTIONS of Admin
-----------------------------------------------
permission_description
-----------------------------------------------
Can create files
Can edit files
Can view files
希望这能帮到你!
答案 1 :(得分:0)
SELECT t2.perm_desc FROM role_perm as t1
JOIN permissions as t2 ON t1.perm_id = t2.perm_id
WHERE t1.role_id = :role_id;
这个命令告诉MySQL通过共享列(perm_id)加入role_perm和权限,这是正确的。但后来我们错过了这两个表中角色ID之间的连接。无论role_perm.role_id是否指向正确的role_id,连接都会产生一个表,其中包含权限表中perm_id存在于role_perm表中的列。 where子句仅过滤t1。这可能会导致获得其他角色拥有的权限。要解决此问题,请将SQL命令更改为
SELECT t2.perm_desc FROM role_perm as t1
JOIN permissions as t2 ON t1.perm_id = t2.perm_id AND t1.role_id=t2.role_id
WHERE t1.role_id = :role_id;