Использование nestedset в Laravel для разработки вложенного дерева треантов - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь выяснить, как работают эти вложенные множества в Laravel. У меня есть отношение многие ко многим между organizations и departments. organization может иметь много departments. Отдел может иметь много departments. Для этого я использую Nestedsets .

Что я пытаюсь сделать, так это получить все организации от пользователя. По этому запросу я бы хотел получить все отделы, связанные с этими организациями. Мне нужна структура, поэтому у меня есть бесконечные родительские -> дочерние отношения в моих отделах, поэтому я могу построить структурное дерево, используя treant.js .

Я почти уверен, что все правильно построено в моей базе данных, поэтому моей первой мыслью было использовать with. Однако, похоже, у меня только первые дети. Вот пример:

$currentUser->organizations()->with(
            'departments.children',
            'departments.commodities',
            'departments.children.commodities',
        )->get()

Я должен включить детей. [Модель] для каждого вложенного отдела. Так что, если у меня два уровня, я должен добавить департаменты.children.children.commodities и так далее. Это кажется довольно отсталым!

Я пробовал довольно много разных подходов, чтобы найти правильное решение, но тот, который приведен ниже, является моим лучшим решением на данный момент. Я просто чувствую, что неправильно использую nestedset-библиотеку.

public function getUserDepartmentTree() {
    foreach ( $this->organizations()->get() as $organization ) {
        $dep[] = $organization->departments()->get()->toTree();
    }

    return $dep;
}

Итак, мой вопрос: как мне получить все реляционные данные из древовидной структуры моих отделов?

1 Ответ

0 голосов
/ 18 мая 2019

Для этого вы захотите использовать descendants вместо children, так как children вернет только прямые / первые дочерние модели, тогда как descendants вернет все под определенным узлом.

Так как это добавит отношение как descendants вместо детей, вам нужно будет немного его настроить, то есть изменить имя отношения, а затем использовать метод toTree():

$organizations = $currentUser->organizations()
    ->with('departments.commodities', 'departments.descendants.commodities')
    ->get()
    ->map(function ($organization) {
        $organization->departments->map(function ($department) {
            return $department->setRelation('children', $department->descendants->toTree())->unsetRelation('descendants');
        });

        return $organization;
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...