Merhaba,
Kategoriler için BlueM/Tree paketini kullanıyorum. E-ticaret sitesi. En fazla 4 level var kategorilerde örneğin;
Vasıta
Tabi diğerlerinin de altı var altın altı da var 😃 Benim sorum şu olacak daha performanslı bir yöntem var mı? Çünkü bu şekilde 1.5 -2 saniye gibi bir bekleme süresine ulaştı ne kadar normal bilmiyorum önce size detayları vereyim.
Toplamda: 597 adet kategori kaydı var. Örneğin bir ana kategoriye girdiğim zaman;
Sustainable Fashion (3)
@elseif($categories->getLevel() == 4)
@php
$nowCurrent = $tree->getNodeById($currentCategory->id); // Chinos
$categoriesLevel = $tree->getNodeById($categories->toArray()['parent_id']); // Hosen & Leggins
$categoriesLevel_up = $tree->getNodeById($categoriesLevel->parent_id); // Damen
$categoriesLevel_up_up = $tree->getNodeById($categoriesLevel_up->parent_id); // Nachhaltige Mode
$data = \Modules\Category\Entities\Category::select('id', 'parent_id', 'name', 'slug')->where('status', '=', 'active')->orderBy('order', 'asc')->orderBy('id', 'asc')->get()->toArray();
@endphp
<li>
<a class="active" href="{{ route('shop.category.index', $categoriesLevel_up_up->slug) }}">{{ $categoriesLevel_up_up->name[Config::get('app.locale')] }} ({{ getProductCategoryCount($data, $categoriesLevel_up_up->id) }})</a>
<ul style="margin-left: 20px;">
@foreach($categoriesLevel_up_up->getChildren() as $categoryLevelUpUp)
<li>
<a class="{{ $categoryLevelUpUp->id == $nowCurrent->getParent()->parent_id ? 'active' : '' }}" href="{{ route('shop.category.index', $categoryLevelUpUp->slug) }}">{{ $categoryLevelUpUp->name[Config::get('app.locale')] }} ({{ getProductCategoryCount($data, $categoryLevelUpUp->id) }})</a>
<ul style="margin-left: 20px;" class="{{ $categoryLevelUpUp->id == $nowCurrent->getParent()->parent_id ? '' : 'collapse' }}">
@foreach($categoriesLevel_up->getChildren() as $categoryLevelUp)
<li>
<a class="{{ $categoryLevelUp->id == $nowCurrent->parent_id ? 'active' : '' }}" href="{{ route('shop.category.index', $categoryLevelUp->slug) }}">{{ $categoryLevelUp->name[Config::get('app.locale')] }} ({{ getProductCategoryCount($data, $categoryLevelUp->id) }})</a>
<ul style="margin-left: 20px;" class="{{ $categoryLevelUp->id == $nowCurrent->parent_id ? '' : 'collapse' }}">
@foreach($categoryLevelUp->getChildren() as $categoryLevelSub)
@php
$count = \Modules\Product\Entities\Product::where(['status' => 'accepted'])->where('category_id', $categoryLevelSub->id)->count();
@endphp
<li>
<a class="{{ $categoryLevelSub->id == $nowCurrent->id ? 'active' : '' }}" href="{{ route('shop.category.index', $categoryLevelSub->slug) }}">{{ $categoryLevelSub->name[Config::get('app.locale')] }} ({{ getProductCategoryCount($data, $categoryLevelSub->id) }})</a>
</li>
@endforeach
</ul>
</li>
@endforeach
</ul>
</li>
@endforeach
</ul>
</li>
@endif
Burada tüm kategorileri çekiyorum. O kategorinin ID'sini alıp şu fonksiyon içerisine tüm kategoriler ile birlikte gönderiyorum.{{ getProductCategoryCount($data, $categoryLevelUpUp->id) }}
Bu fonksiyonda şöyle;
if (! function_exists('getProductCategoryCount')) {
function getProductCategoryCount($categoryData, $categoryId)
{
$tree = new Tree(
$categoryData,
['id' => 'id', 'parent' => 'parent_id', 'title' => 'name']
);
$ids = [];
$node = $tree->getNodeById($categoryId);
foreach ($node->getDescendantsAndSelf() as $descendant) {
array_push($ids, $descendant->id);
}
$count = Product::where(['status' => 'accepted'])->whereIn('category_id', $ids)->count();
return $count;
}
}
Yani başka nasıl yapacağımı bilmiyorum. Çok yavaş değil ama yine de nasıl daha performanslı veya mantıklı yapabiliyorum şu an için bilmiyorum. Yoksa cache yöntemi mi kullanmam lazım redis gibi.