数据库关系,我无法理解,MYSQL,PHP

时间:2012-07-22 05:44:20

标签: php mysql database

我在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_idperm_id列,引用角色和权限的主键。

有点困惑。有人能用一种简单的语言向我解释吗?

2 个答案:

答案 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_permissionspermissions 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;