как посчитать количество товаров в категории( т.е во всех ее подкатегорий)?Laravel

Модель

class Category extends Model
{

    public function products()
    {
        return $this->hasMany('App\Product');
    }
    public function children() {
        return $this->hasMany('App\Category', 'parent_id');
    }
    public function parent() {
        return $this->belongsTo('App\Category', 'parent_id');
    }
}

$categories = Category::where('parent_id', null)->get();

так получу только количество под категорий:

@foreach($categories as $category)
    <span>({{$category->children->count()}})</span>
@endforeach

Так только в данной категории, но не в дочерних, а мне нужно только в дочерних так как в родительской не будет

@foreach($categories as $category)
    <span>({{$category->products->count()}})</span>
@endforeach

Cпасибо!


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

Автор решения: Romka

Можно так например:

public function countProductsInSubCategories(): int
{
    return $this->children()->get()
        ->sum(function (Category $category) {
            return $category->products()->count();
        });
}

Тут первый запрос выберет все дочерние категории, и по каждый такой категории будет выполнен еще один запрос count(). Это не самый оптимальный способ, хотя бы потаму, что зависит от количества под категорий.

Можно так:

public function countProductsInSubCategories(): int
{
    $categoryIds = $this->children()->get(['id'])->pluck('id')->toArray();

    return Product::query()->whereIn('category_id', $categoryIds)->count();
}

Тут будет выполнено всегда 2 запроса. Первый выберет id дочерних категорий. Второй посчитает количество товаров в этих категориях.

Так же советую прочитать про eager load для оптимизации запросов.

→ Ссылка