Laravel 检索板的所有 Parents

Laravel Retrieve All Parents For A Board

我有一个名为 "Announcements" 的板,它位于一个名为 "Important Information" 的板中,而该板位于 "Headquarters" 中。这是它的直观表示。


总部(没有parent的主板)[id = 1, parent_id = null]

↳ 重要信息("Headquarters" 的第一个 child 板)[id = 2, parent_id = 1]

↳ 公告("Important Information" 的第一 child 董事会)[id = 3, parent_id = 2]


我的 objective 是在 Laravel 模型中获得所有 "Announcements" parent 板。


我已经构造了一个函数来获得一个 parent 板。

public function parent()
{
    return $this->where('id', $this->parent_id)->first();
}

如果您将此函数用于 "Announcements" 板,它将 return "Important Information" 板的结果,因为那是 parent "Announcements".

假设我要创建一个名为 listAllParents()

的函数
public function listAllParents()
{
    // code here
}

此函数将 return 与指定板关联的所有 parent 的结果。因此,如果我要在 "Announcements" 上使用此功能,我希望所有与之关联的 parent 都被 returned.

这是一个小代码示例:

$board = Board::where('name', 'Announcements')->first();
$getAllParents = $board->listAllParents()->get();

return $getAllParents;

应该 returned 是 "Announcements" parent 板的列表,即:"Important Information" & "Headquarters"。 listAllParents() 函数中应包含哪些代码才能实现此目的?

如果您需要更好的解释,请告诉我。我将非常乐意提供帮助。

非常感谢您的帮助。

鉴于您当前的结构,您最好的选择是遍历层次结构中的每个 Board,直到到达 Board,其中 parent_id === null。例如:

public function listAllParents()
{
    $board = $this;
    $parents = [];

    while (! is_null($board->parent_id)) {
        $board = $board->parent();
        $parents[] = $board;
    }

    return $parents;
}

然而,这是非常低效的,因为您正在执行查询以查找层次结构的每个级别的节点。

另一种方法是使用嵌套树数据结构,Laravel 中有各种包可用于实现此功能。