Если вы знаете, сколько уровней может быть вложено, вы можете использовать Eager Loading.Скажем, если максимальная глубина составляет 3 уровня, вы можете сделать:
$model->with('parent.parent.parent');
Вы также можете использовать рекурсию вместо цикла.
public function getParentsAttribute()
{
if (!$this->parent) {
return collect([]);
}
return collect($this->parent->parents)->push($this->parent);
}
В случае, если вы тоже хотите добавить первый объект(само) полный вызов будет:
$model->parents->push($model)->reverse->implode('attr_name', '/');
, который вы также можете заключить в атрибут
public function getPathAttribute() {
return $model->parents->push($model)->reverse->implode('attr_name', '/');
}
И позвонить как $model->path;