我有一个mysql表来驱动我网站上的菜单。我为每个菜单项都有一个列,用于定义哪些用户角色可以查看菜单项。
我存储"授权"角色作为逗号分隔列表
我正在尝试构建一个查询,允许我提供用户所在的角色列表,并找到允许他们查看的菜单项。我尝试使用LIKE %ROLE1% %ROLE2%
等等......但这只会返回所有这些角色中的菜单项。
如何找到用户的角色和相应的菜单项?
答案 0 :(得分:0)
我同意每个人都会告诉你,你的数据库需要normalization,更具体地说,要考虑First Normal Form。您应该创建一个MENU_ITEM_ROLE
表,该表将用作ROLE
和MENU_ITEM
之间的桥接表。它将使用MENU_ITEM
实体的主键以及访问它所需的相应ROLE来保存多个记录。
但是,考虑到你的情况,你说你试过:
LIKE %ROLE1% %ROLE2%
e.t.c.它只返回所有角色可用的菜单项。我假设这可能是因为您在不同的LIKE表达式之间使用了AND
运算符。在这种情况下,我想说的合适的运算符是OR
,并且只检索具有至少一个OR
ed角色的菜单项。
您应该考虑这个解决方案并尝试使用字符串操作来解决此问题,如果您的角色名称具有相似的值,则会导致更多麻烦。例如。在角色'ROLE_ADMIN'
上有一个菜单项A,在角色'ROLE_ADMIN_USERS'
上有另一个菜单项B,那么具有角色'ROLE_ADMIN'
的用户将能够看到菜单项A和B
考虑到这种情况,最可靠的解决方案是使用标记MENU_ITEM
表的角色字段的函数,然后搜索匹配项。
在这个方向上,我会使用像FIND_IN_SET
这样的东西。
E.g。
select * from menu_item where find_in_set('ROLE1', roles)>0
也参考here。