Вытащить все категории и сгруппировать их по родительскому идентификатору - PullRequest
0 голосов
/ 16 апреля 2019

Я работаю с запросами данных Laravel, и мне нужен запрос, который собирает все дочерние элементы родительского элемента, когда я беру категории.

таблица категорий имеет имя и parent_id, маршрутыДля этих категорий parent_id имеет значение null, запрос должен возвращать каждую категорию, сгруппированную по родительскому идентификатору, а родительский элемент должен быть первым узлом каждой группы.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Если вы хотите где-то отображать категории как родительские дочерние, вам не нужно их так собирать, вы можете установить отношения внутри модели, как

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();

Я не тестировал код, но примерно так оно и будет.

0 голосов
/ 16 апреля 2019

Когда вы получаете возвращенную коллекцию из запроса, вы можете использовать метод -> groupBy () , где вы можете указать поле, по которому должны быть сгруппированы результаты.

Предполагая, что модель вашей категории Category:

$categories = Category::all()->groupBy('parent_id')->toArray();
...