You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel关联查询问题:如何显示无列表的分类及0计数

解决方案:显示所有分类及对应列表数量(含无列表的分类)

当然可以实现!你当前的查询用了内连接(Inner Join),所以只会返回在listings表中有对应数据的分类。要包含所有分类,哪怕没有对应列表,只需要改成左连接(Left Join),再处理空计数的情况就行。下面给你两种实现方式,其中第二种更符合Laravel Eloquent的最佳实践:

方法一:手动修改Join查询

把join换成leftJoin,并用COALESCE确保空计数显示为0:

$categories = Categories::leftJoin('listings', 'categories.id', '=', 'listings.category_id')
    ->select('categories.*', DB::raw('COALESCE(count(listings.id), 0) as listings_count'))
    ->groupBy('categories.id', 'categories.name') // 这里需要添加categories表中所有非聚合的字段,比如name、created_at等,根据你的表结构调整
    ->get();

关键说明:

  • leftJoin:会保留categories表的所有记录,即使listings表中没有匹配的行(此时listings相关字段为NULL)
  • COALESCE(count(listings.id), 0):虽然count(listings.id)本身在无匹配时会返回0,但用COALESCE可以确保在某些数据库的特殊场景下,空值被转为0,更严谨
  • groupBy:如果你的Laravel开启了严格模式(默认开启),必须把select中所有非聚合的字段(也就是categories表的字段)都加到groupBy里,否则会触发SQL错误。如果categories.id是主键,部分数据库(如MySQL)允许只按主键分组,但遵循SQL标准的写法更稳妥。

方法二:使用Eloquent的withCount(推荐)

Laravel Eloquent提供了更简洁的withCount方法,自动帮你处理左连接和计数逻辑,代码更易读且不易出错:

首先确保你的Categories模型中定义了和Listings的关联关系:

// app/Models/Categories.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Categories extends Model
{
    public function listings()
    {
        return $this->hasMany(Listing::class, 'category_id');
    }
}

然后直接查询:

$categories = Categories::withCount('listings')->get();

查询后,每个Category实例会自动带上listings_count属性,值就是对应分类的列表数量,没有列表的分类会显示0,完全符合你的需求!

这种方法不需要手动写复杂的join和groupBy,是Laravel官方推荐的关联计数方式,代码更优雅也更易维护。

内容的提问来源于stack exchange,提问作者Dewagg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:32:15