Laravel Рекурсивные отношения - PullRequest
0 голосов
/ 20 марта 2019

У меня есть следующие таблицы:

directories
    id
    parent_directory_id

users
    id

user_directory_access
    directory_id
    user_id

Пример:

Мне нужно найти directories с id из 45, который имеет любой рекурсивный parent_directory_id, который присутствуетв таблице user_directory_access, которая имеет user_id из 3

В идеале я бы хотел, чтобы пользователь автоматически наследовал доступ к каталогу, если у него есть доступ к любому из родительских каталогов (рекурсивный по всемуиерархия) так, например, если у меня есть доступ к корневому каталогу, мне должен быть разрешен доступ ко всем дочерним элементам через 1 запись, хранящуюся в таблице user_directory_access.

Что было бы жизнеспособным решением, я открыт дляреструктуризация при необходимости.

Попробовал много разных решений безрезультатно, спасибо заранее!

1 Ответ

2 голосов
/ 20 марта 2019

Вы можете иметь карту (кэшированную в memcache или в файле или в другой таблице) из directory_id и список parent_directory_id его родителей, поэтому для этой структуры:

1
┣━━━2
┃   ┗━━━4
┃       ┗━━━5
┗━━━3

Ваша карта будет выглядеть так:

$parents_map = [
    1 => [],
    2 => [1],
    3 => [1],
    4 => [2, 1],
    5 => [4, 2, 1],
];

Всякий раз, когда вы добавляете новый дочерний каталог, ищите parent_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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...