将数据库结构更新为嵌套集(baum) - 族树

时间:2017-02-21 10:37:44

标签: php laravel nested

所以我最初在mother_id表上使用father_idpersons 现在由于你只能通过一个查询递归加载所有母亲和父亲的问题,我想改变它,因为现在家庭树变得越来越慢了#34;

经过一些谷歌搜索后,我很快发现嵌套集(使用:" gazsp / baum")是推荐的处理方式。

据我所知,这将是正确的(?)设置:

     ___________________________________________________________________
|  Root - Person that is no parent of anyone                        |
|    ____________________________    ____________________________   |
|   |  First Child - Father     |   |  Second Child - Mother    |   |
|   |   __________   _________  |   |   __________   _________  |   |
|   |  |  Father |  | Mother |  |   |  |  Father  |  | Mother|  |   |
1   2  3_________4  5________6  7   8  9_________10 11_______12 13  14
|   |___________________________|   |___________________________|   |
|___________________________________________________________________|

现在我无法将mother_idfather_id关系转换为新版本。我所做的是首先循环遍历所有人并默认为root。我似乎遇到了一些问题,我认为是由于字段为NULL。

现在我按照以下代码进行了操作,我希望将旧关系正确地转换为嵌套集。

$allPersons = \App\Person::all();

foreach($allPersons as $person)
{
    if($person->father_id != 0)
    {
        $allPersons->find($person->father_id)->makeChildOf($person);
        $person->father_id = 0;
    }

    if($person->mother_id != 0)
    {
        $allPersons->find($person->mother_id)->makeChildOf($person);
        $person->mother_id = 0;
    }
    $person->save();
}

我多次遇到以下错误,而我发现结构没有任何问题。我无法找到任何可能导致此问题的循环或错误。

A node cannot be moved to a descendant of itself (inside moved tree).

我还尝试添加以下内容,然后让父亲/母亲成为一个孩子"(由于我使用它的上下文,命名确实让我很困惑)。这看起来似乎没有发现错误,同时查看我认为它应该出现的错误消息。

$mother = $allPersons->find($person->mother_id);
if($mother->isSelfOrDescendantOf($person)) dd('Already descendant');
$mother->makeChildOf($person);

我已经在这方面工作了很长一段时间,而且我不再有任何进展了。我使用嵌套集错了吗?是我的#34;翻译"脚本不正确或者您有更好的解决方案然后嵌套集请告诉我。

0 个答案:

没有答案