Laravel递归关系

时间:2019-03-20 17:44:28

标签: php mysql laravel eloquent

我有下表:

directories
    id
    parent_directory_id

users
    id

user_directory_access
    directory_id
    user_id

示例:

我需要找到directoriesid的{​​{1}},该45表中存在user_directory_access表为user_id的任何递归parent_directory_id 3

理想情况下,如果用户有权访问任何父目录(在整个层次结构中都是递归的),我希望用户自动继承对目录的访问权,例如,如果我有权访问根目录,则应允许我访问通过存储在user_directory_access表中的1条记录来确定所有子项。

那将是一个可行的解决方案,如果需要,我愿意进行重组。

尝试了许多不同的解决方案,但无济于事!

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);
}