как посчитать количество товаров в категории( т.е во всех ее подкатегорий)?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 для оптимизации запросов.