Получить полный путь вложенных родителей - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть модель с именем Source, которая содержит столбец parent_id.Каждый источник может иметь parent_id, а иерархия бесконечна.Если Source не имеет parent_id, то это корень.

Теперь у меня есть следующие методы в моей модели:

public function parent()
{
    return $this->hasOne('App\Source', 'id', 'parent_id');
}

public function children()
{
    return $this->hasMany('App\Source', 'parent_id')->orderBy('name');
}

У меня нет проблем с получениемхороший список детей, например:

$parents = Source::with('children')->whereNull('parent_id')->orderBy('name')->get();
$traverse = function ($parents, $prefix = '') use (&$traverse) {
    foreach ($parents as $parent) {
        echo '<option value="'.$parent->id.'">'.$prefix.$parent->name.'</option>';
        $traverse($parent->children, $prefix.'- ');
    }
};
$traverse($parents);

Моя проблема в том, что я хочу получить полную строку названия модели вместе с именами ее родителей.

Итак, скажем, у меня были следующие источники:

Parent 1
- Child 1
- - Subchild 1
- - Subchild 2
- Child 2

Я пытаюсь создать функцию, которая выдаст мне Parent 1 - Child 1 - Subchild 1 при вызове Subchild 1

Вот то, что я пробовал, которое, кажется, дает толькомне родительское имя верхнего уровня:

public static function treeName(Source $source, &$tree)
{
    if ($source->parent) {
        $tree[] = self::treeName($source->parent, $tree);
    }
    else {
        $tree[] = $source->name;
    }
}

$source = Source::where('name', 'Subchild 1')->first();
$tree = [];
Source::treeName($source, $tree);
Log::info($tree);

Это дает мне:

[2018-04-25 23:02:25] laravel.INFO: array (
  0 => 'Parent 1',
  1 => NULL,
  2 => NULL,
)

Я могу просто взорвать массив на -, но массив не дает мне то, что я хочу,Как мне заставить это работать?

Вот что я хочу:

array (
      0 => 'Parent 1',
      1 => 'Child 1',
      2 => 'Subchild 1',
    )

1 Ответ

0 голосов
/ 26 апреля 2018

В результате вы получите желаемый результат в массиве:

function toArray($child) {
    $tree = [];

    while($child) {
        // Prepand the name to the front of the array
        array_unshift($tree, $child->name);
        // Overwrites `$child` with it's parent, for next iteration
        // If the parent doesn't exist, $child will be null
        // which will also end the `while` loop
        $child = $child->parent;
    }
    return $tree;
}

Передайте ему дочерний объект, и он вернет массив.

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