Как вывести записи всех подкатегорий через сводную таблицу

Сейчас вывожу записи конкретной категории на которую перехожу, а вот как вывести записи всех подкатегорий? При этом использую сводную таблицу

Companies | Categories | Company_category

Подкатегории вывожу через parent_id

Сейчас код выглядит вот так:

$companies = Company::search(request('search'))->query(function(Builder $query) use($category){
    $query->select(['id', 'name', 'company_type_id', 'logo'])
    ->when($category->exists, function(Builder $query) use($category){
        $query->whereRelation(
            'categories',
            'categories.id',
            '=',
            $category->id
        );
    })
    ->sorted()
    ->companyByCity();
})->paginate(15);

Category Model

    public function companies(): BelongsToMany
{
    return $this->belongsToMany(Company::class, 'category_company');
}

public function categories(): HasMany
{
    return $this->hasMany(Category::class);
}

public function childrenCategories(): HasMany
{
    return $this->hasMany(Category::class)->with('categories');
}

public function parent(): belongsTo
{
    return $this->belongsTo(Category::class, 'id');
}

Company Model

public function categories(): BelongsToMany
{
    return $this->belongsToMany(Category::class, 'category_company');
}

Ответы (1 шт):

Автор решения: Raz Galstyan

Выше упамянут ответ. Там при момощи этого запроса можно вывести все подкатегории заданной категории.

При помощи этого запроса можно сделать так.

Сперва нам нужно взять все id категорий которые нам нужны.

$categoryIds = DB::select("
        with recursive cte (id, parent_id)
             as (
                 select     id,
                            parent_id
                 from       categories
                 where id = $parentCategoryId
                 union all
                 select     categories.id,
                            categories.parent_id
                 from       users
                 inner join cte on categories.id = cte.parent_id
             )
        select * from cte;
    ")->pluck('id')->toArray();

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

$companies = Company::query()
    ->where('field_name', $search)->whereHas('categories', 
          function($query) use($categoryIds) {
              $query->whereIn('category_id', $categoryIds)
          })->get();
→ Ссылка