Если вы хотите где-то отображать категории как родительские дочерние, вам не нужно их так собирать, вы можете установить отношения внутри модели, как
class Category {
public function children()
{
return $this->hasMany(self::class, 'parent_id');
}
public function parent()
{
return $this->hasMany(self::class, 'id', 'parent_id');
}
}
Возможно, это будут отношения один-ко-многим, а не многие-ко-многим, в зависимости от ваших требований.
Теперь вы можете просто получить всех родителей, как
Category::whereNull('parent_id')->get();
или используя область действия
Category::parent()->get();
и определите область действия в модели
и цикл по родительской категории, такой как
@foreach ( $categories as $category )
{{ $category->name }}
@foreach ( $category->children as $subCategory )
{{ $subCategory->name }}
@endforeach
@endofreach
и для поиска родителей с детьми вы можете использовать
Category::whereNull('parent_id')->with('children')->get();
или
Category::parent()->with('children')->get();
Я не тестировал код, но примерно так оно и будет.