我的数据库帮助程序类加入问题

时间:2014-11-23 14:08:07

标签: php mysql join left-join

我正在处理我的项目SimpleSite,并在创建RBAC帮助程序类时遇到了数据库帮助程序类的问题。问题是使用多个表执行JOIN。具体查询可以在这里看到:

SELECT SS_roles.name, SS_roles.is_admin, SS_privileges.name AS priv 
FROM SS_roles 
    LEFT JOIN SS_role_privs ON role_id=SS_roles.id 
    LEFT JOIN SS_privileges ON priv_id=SS_privileges.id 
WHERE SS_roles.name='Guest';

在查询构建期间,我使用外键将表名预先挂起到列的开头。问题是带有列的表并不总是我们想要加入的表(与来自priv_id的{​​{1}}的情况一样)。如果我尝试按照我想要的方式使用select(),我会以此结尾(注意SS_role_privs中的SS_roles.SS_role_privs.priv_id):

JOIN

问题是由此处的行引起的:https://github.com/Jonnycake/SimpleSite/blob/master/includes/classes/simpledb.class.php#L350

我可以通过使用SimpleDB打开SELECT SS_roles.name, SS_roles.is_admin, SS_privileges.name FROM SS_roles LEFT JOIN SS_role_privs ON SS_roles.id=SS_role_privs.id LEFT JOIN SS_privileges ON SS_roles.SS_role_privs.priv_id=SS_privileges.id WHERE SS_roles.name='Guest'; 表而不是SS_role_privs来解决这个问题 - 这样两个外键都来自同一个表,但我想这样做我可以创建一个与上面完全相同的查询(使用select()函数从SS_roles中选择),并且不需要每个多表连接的关系表。我已经考虑过检测正在连接的列名是否包含句点,如果没有,请不要预先挂起表名,但如果我没记错,MySQL支持表名中的句点,只要它包含在反引号中。 / p>

非常感谢任何有关如何处理联接的建议。

编辑:快速思考可能的解决方案 - 在相关表格中有一个单独的类,您可以在其中说明

SS_roles

但是,就像我说的那样,我宁愿不为每个多表连接要求一个关系表(尽管应该有一个关系表)。

问题的真正原因在于,如果你有这样的事情:

$ss_role_privs=new SDBRelation("role_privs", 
           array("priv_id"=>"privileges.id", 
                 "role_id"=>"roles.id"
           )
);
$ss_role_privs->select(
           array("roles.name",
                 "roles.is_admin",
                 "privileges.name"
           ),
           array(
                 "AND"=>array("roles.name"=>array(
                                                 "op"=>'=',
                                                 "value"=>'Guest'
                                            )
                        )
            ),
            "LEFT"
);

关系是Table_1.y与Table_2.x和Table_2有关。与Table_3.x有关,你在使用我的类从table_1中选择时无法加入表3。

0 个答案:

没有答案