我正在处理我的项目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。