Laravel может справиться с этим довольно красноречиво (каламбур). Просто определите модель и 2 отношения:
class Department extends Model(){
public function parent(){
return $this->belongsTo(self::class, "parent_id", "id");
}
public function children(){
return $this->hasMany(self::class, "parent_id", "id");
}
}
Затем, при запросе, сначала выберите тех, у кого нет родителя (отделы "верхнего уровня")
$departments = Department::doesntHave("parent")->with(["children"])->get();
Затем просто зациклите$departments
и их "children"
:
foreach($departments AS $department){
echo $department->name;
foreach($department->children AS $child){
echo $child->name;
}
}
Поскольку это вложенные циклы, вы получите правильный результат;каждое подразделение «верхнего уровня» будет немедленно перечислено, за которым следуют от 0 до X его дочерних элементов.