У меня есть модель с именем 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',
)