我有下表:
directories
id
parent_directory_id
users
id
user_directory_access
directory_id
user_id
示例:
我需要找到directories
为id
的{{1}},该45
表中存在user_directory_access
表为user_id
的任何递归parent_directory_id 3
理想情况下,如果用户有权访问任何父目录(在整个层次结构中都是递归的),我希望用户自动继承对目录的访问权,例如,如果我有权访问根目录,则应允许我访问通过存储在user_directory_access
表中的1条记录来确定所有子项。
那将是一个可行的解决方案,如果需要,我愿意进行重组。
尝试了许多不同的解决方案,但无济于事!
答案 0 :(得分:2)
您可能有一个directory_id的映射(缓存在memcache或文件或另一个表中)及其父目录的parent_directory_id列表,因此对于此结构:
1
┣━━━2
┃ ┗━━━4
┃ ┗━━━5
┗━━━3
您的地图如下所示:
$parents_map = [
1 => [],
2 => [1],
3 => [1],
4 => [2, 1],
5 => [4, 2, 1],
];
无论何时添加新的子目录,都要查找其父目录的parents_map并将其添加到地图中:
// new directory 6 whose parent is 3:
$new_id = 6;
$parent_id = 3;
$parents_map[$new_id] = array_merge([$parent_id], $parents_map[$parent_id]);
然后,当您需要检查目录的权限时,请在地图中查找它,并查看其任何父级是否具有权限。
$directory_id = 6;
foreach($parents_map[$directory_id] as $parent_id) {
check_permissions($user_id, $parent_id);
}