我一直在关注 PHP 身份验证教程 en 设法让它工作。
现在我想向导航栏添加一个函数。我会尝试解释,希望有人知道答案。
我有 2 个用户表,用户和 user_permissions.
在用户表中还有名为district_id
、district
、gemeente_id
和gemeente
的附加列。我在数据库中还有 2 个额外的表,称为districten
和gemeenten
.
districten
表有 2 列。id
和district
拥有独特的ID
和name
。gemeente
表至少有这 3 列id
、district_id
和gemeente
。
以下是我希望发生的事情:
当用户登录查询时,将在导航栏中的<ul>
中给出结果,其中将显示用户分配到的gemeenten
表中的所有值(列gemeente
)。
例:
用户 ZZZ 被分配到区 A.
该区拥有 4 个 gemeenten:城市 1、城市 2、城市 3 和城市 4
当用户登录时,他应该 只看到A区的城市。
我不知道如何在 Slim2 框架中使其工作并集成到 PHP 身份验证代码中。因此,非常感谢任何帮助。
首先,您必须规范化表并删除冗余信息,因为在关系数据库中很难维护它(我假设您在这里使用像MySQL这样的关系数据库)。
所以基本上每个用户都被分配到 gemeente,每个 gemeente 被分配到区,而区又有城市(gemeenten)。在用户表中,您只需要gemeente_id
。districten
和gemeente
的架构似乎很好。
有两种方法可以检索所需数据:运行 2 个查询(1 个用于获取用户的选区;2 个用于获取选区的城市)并在一个查询中运行所有内容。选择哪种方式取决于您。
第一种方法:
SELECT d.id FROM district AS d LEFT JOIN gemeente AS g ON g.district_id=d.id LEFT JOIN user AS u ON u.gemeente_id=g.id WHERE u.id=<user_id>
SELECT g.id, g.gemeenten from gemeente as g where g.district_id = <res_of_prev_query>
第二种方法:
SELECT
g.id, g.gemeenten
FROM gemeente AS g
LEFT JOIN
districten AS d
ON g.district_id=d.id
INNER JOIN (
SELECT DISTINCT district_id, u.id AS user_id
FROM gemeente as gg
INNER JOIN user AS u
ON u.gemeente_id=gg.id) AS ud
ON ud.district_id=g.district_id
WHERE ud.user_id=<user_id>
您需要将此查询转换为您的ORM/ActiveRecord,运行它并显示ul
列表
UPD:我已经更新了我的答案。感谢@DarkBee指出我的错误