Laravel Получить всех родителей за доску - PullRequest
0 голосов
/ 31 января 2020

У меня есть доска объявлений под названием «Объявления», которая находится на доске под названием «Важная информация», в которой она находится в «Штаб-квартире». Вот визуальное представление этого.

Штаб-квартира (Главный совет без родителей) [id = 1, parent_id = null]

↳ Важная информация (1-й ребенок в «Штаб-квартире») [id = 2, parent_id = 1]

↳ Объявления (1-й ребенок доска «Важная информация») [id = 3, parent_id = 2]

Моя цель - получить все родительские платы "Объявления" в модели Laravel.

Я уже создал функцию, которая получает одну родительскую плату.

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

Если бы вы использовали эту функцию для доски объявлений, она выдала бы результаты «Важной информации». "board, потому что это родительский элемент" Announcements ".

Итак, предположим, я должен был создать функцию listAllParents ()

public function listAllParents()
{
    // code here
}

Эта функция будет возвращать результаты всех связанных родителей с указанной платой. Поэтому, если бы я использовал эту функцию в «Объявлениях», я бы хотел, чтобы все родители, связанные с ней, были возвращены.

Вот небольшой пример кода:

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

return $getAllParents;

И что в случае будет возвращен список родительских плат «Объявления», который будет: «Важная информация» и «Штаб-квартира». Какой код должен go в функцию listAllParents (), чтобы сделать это возможным?

Если вам нужно более подробное объяснение, пожалуйста, дайте мне знать. Я буду более чем рад помочь.

Большое спасибо за вашу помощь.

1 Ответ

3 голосов
/ 31 января 2020

Учитывая вашу текущую структуру, ваш лучший вариант - перебирать все Board в вашей иерархии, пока не достигнете Board, где parent_id === null. Например:

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

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

    return $parents;
}

Это, однако, крайне неэффективно, так как вы выполняете запрос для поиска узла на каждом уровне иерархии.

Альтернативным подходом может быть использование структуры данных Nested Tree, и для реализации этой функции в Laravel.

доступны различные пакеты.
...