【问题标题】:count post with all categories in laravel 5在 laravel 5 中计算所有类别的帖子
【发布时间】:2026-01-16 10:30:01
【问题描述】:

你好,我有两张表,一张是类别,另一张是 ads_listings。在类别表中有 4 列 id、parent_category_id、category_slug、category_title。这里 parent_category_id 0 表示主类别,其余部分表示子类别。用户在 ads_listings 表中发布存储。现在我想找到这样的特定类别的帖子

vehicles(3)
cars(2)
motorbike(1)
cycle(0)

这里的问题是我的代码只发现了有帖子的子类别。我的控制器代码是

public function countListingsByCategories()
{
    return DB::table("ads_listings")
        ->select("categories.category_title",DB::raw("COUNT(ads_listings.category_id) as num_listings"))
        ->join("categories", "categories.id","=","ads_listings.category_id")
        ->groupBy("ads_listings.category_id")
        ->get();
}

查看代码为:

<ul class="row catelist">
  @if(isset($categoriesNumListings) && count($categoriesNumListings))      
     @foreach($categoriesNumListings as $categoriesNumListings)          
        <li class="col-md-12"><a href="{{ route('view.listings.by.category', $categoriesNumListings->category_title) }}" title="{{ $categoriesNumListings->category_title }} ads from {{ $categoriesNumListings->category_title }}">{{ $categoriesNumListings->category_title }} <span>({{ $categoriesNumListings->num_listings }}Listings )</span></a></li>
    @endforeach
  @endif
</ul>

我的类别表是:

ads_listing 表是:

【问题讨论】:

    标签: php mysql laravel laravel-5


    【解决方案1】:

    我认为问题在于,当您主要想计算类别并获取 ad_listings 的数量时,您正在计算 ad_listings,我会这样做:

    第二枪:)

    public function countListingsByCategories()
    {
        return DB::table("categories")
          ->select("categories.category_title",
            DB::raw("categories.title, 
              CASE 
                WHEN (categories.parent_id = 0) 
                THEN (SELECT count(ads_listings.category_id)  
                  FROM ads_listings 
                  WHERE ads_listings.category_id in 
                        (SELECT subcategory.id 
                        FROM categories subcategory
                        WHERE subcategory.parent_id = categories.id))
                ELSE (SELECT COUNT(ads_listings.category_id)  
                      FROM ads_listings 
                      WHERE ads_listings.category_id = categories.id)
                END as numberOfPosts, 
              CASE 
                WHEN (categories.parent_id = 0) 
                THEN (select 'Category') 
                ELSE (select 'subCategory')
                END as type 
            FROM categories"))
          ->get();
    
    }
    

    【讨论】:

    • 此代码统计所有帖子与一个类别。在类别表中存储了所有类别和子类别,此处 parent_category_id=0 表示主类别,其余 id 表示子类别。 category_title 是类别的名称。 ads_listing 表存储帖子。这是使用 category_id 的两个表之间的关系。在两个表之间,我只找到了有帖子的 category_title。但我希望我的主要类别和子类别按顺序排列,并且在子类别旁边显示帖子编号。如果没有找到帖子,则显示 0 并将所有子类别的帖子编号相加,显示在主类别旁边。
    • 您可以尝试在数据库查询编辑器中只运行 sql 吗? SELECT categories.title, CASE WHEN (categories.parent_id = 0) ....
    • sql 不支持 CASE WHEN