如何使用 Laravel 实现类别子菜单中区域的计数?

How do I achieve a count for regions in a sub menu of categories using Laravel?

我正在尝试获取某个类别下各地区的列表数。

主页上的区域菜单显示了其区域中每个类别的所有列表的数量。 在类别页面上,我试图显示在选定类别中有列表的地区的计数。

在我的列表模型中

 public function scopeInCategory($query, Category $category)
 {
    return $query->whereIn('category_id', [$category->id]);
 }

 public function region()
 {
    return $this->belongsTo(Region::class);
 }

在我的区域模型中

 public function listings()
 {
    return $this->hasMany(Listing::class);
 }

在我的类别控制器中

class CategoryController extends Controller
{

    public function index(Category $category)
    {

        $regions = Region::with(['listings' => function($query) use ($category) {
        
            $query->inCategory($category);
        }])->first('region')->get();

       return view('categories.index', compact('regions'));
   }
}

在我的 region_dropdown.blade.php

 @foreach($regions as $region)
   
     <a class="dropdown-item" href="#">{{ $region->name }} 
    ( {{ $region->listings->count() }} )</a>
     
 @endforeach

但这不起作用区域菜单仍然显示类别页面上每个类别中所有列表的计数。

可以使用Eloquent的withCount方法通过特定的Category获取每个Region下的Listings的计数,然后访问通过访问 Eloquent 将为您初始化的 listings_count 属性,每个 Region 上的 counted 值。

class CategoryController extends Controller
{
    public function index(Category $category)
    {
       $regions = Region::withCount([
           'listings' => fn($q) => $q->where('category_id', $category->id)
       ])->get();
       return view('categories.index', compact('regions'));
   }
}

并且在您的 blade 文件中:

@foreach($regions as $region)
    <a class="dropdown-item" href="#">
        {{ sprintf('%s (%d)', $region->name, $region->listings_count) }}
    </a>
@endforeach

如有任何疑问,请随时提出。