0

我对在mysql中使用多个表很陌生,所以我真的不明白一些事情..

这是我的 .php 文件中的 php 代码role.model.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控制器中调用它并喂了一个$role_id1;getRolePerms(1);

print_r($data)所以我会知道它是否会获取数据,但输出只是

“大批()”

我的问题是,这是如何工作的?

如果我有这些表:

roles
permissions
role_perms

withrole_idperm_id列,引用角色和权限的主键。

有点困惑。有人真的可以用简单的语言向我解释吗?

4

2 回答 2

3

你检查role_perms表格是否有 arole_id为 1 的行?因为应该有查询才能工作。

这是如何运作的?

首先,尝试理解表格及其关系。我想你的表格有点像下面的表格。

ROLE表包含应用程序中的角色(例如 Admin、Guest)。

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(Admin)的权限为 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

从上面的PERMISSIONSROLE_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_descriptions WHERE role_id = 1。因此,完整的指令是

permission_description从联合表(表 4)中检索s,其中 srole_id为 1。

用简单的英语意味着:

检索角色“管理员”的权限描述。

因此查询的结果是:

Table 5: PERMISSION_DESCRIPTIONS of Admin
-----------------------------------------------
  permission_description
-----------------------------------------------
     Can create files
     Can edit files
     Can view files

希望这对你有帮助!

于 2012-07-22T09:55:53.237 回答
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 加入 role_perm 和权限,因为它们是共享列 (perm_id),这是正确的。但是我们错过了这两个表中角色 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;
于 2012-07-22T06:16:04.617 回答