Laravel 中使用 withCount() 预加载关联计数实现高效查询-php教程

在 laravel 中,无需定义额外的模型方法,即可通过 withcount() 快速为查询结果添加关联模型的数量字段,避免 n+1 查询问题,提升性能。

在 Laravel 开发中,当需要查询某模型及其关联记录的数量(例如:每个城市拥有的手机号数量)时,切忌在模型中定义类似 mobile_count() 这样的普通方法并直接用于查询语句中——因为该方法返回的是整型值,无法被 Eloquent 的查询构建器识别,也无法参与 SQL 层面的聚合计算,强行调用会导致逻辑错误或运行时异常。

正确做法是利用 Laravel 内置的 withCount() 关系预加载计数功能。它会在底层自动生成 SELECT … COUNT(*) 子查询或 LEFT JOIN + GROUP BY 语句,一次性高效获取主模型数据及关联统计值。

首先,确保你的 City 模型中正确定义了 hasMany 关系(建议使用复数形式命名,如 mobiles):

// app/Models/City.php
public function mobiles()
{
    return $this->hasMany(Mobile::class);
}

⚠️ 注意:无需也不应再定义 mobile_count() 这类非关系方法——它既不能被查询构造器使用,也无法自动注入到 JSON 响应中;withCount(‘mobiles’) 会自动在结果对象上添加 mobiles_count 属性(Laravel 默认命名规则:关系名 + _count)。

然后,在控制器中重构查询逻辑:

public function findCityWithID($id)
{
    // 使用 withCount 加载 mobiles 关联的数量
    $cities = City::select('id', 'name', 'state_id')
                  ->withCount('mobiles') // ✅ 自动生成 mobiles_count 字段
                  ->where('state_id', $id)
                  ->orderBy('name')
                  ->get();

    // 可选:显式映射为更清晰的键名(如需兼容前端字段约定)
    $response = $cities->map(function ($city) {
        return [
            'id'          => $city->id,
            'name'        => $city->name,           // 注意:原答案中误写为 $city->state
            'state_id'    => $city->state_id,
            'mobile_count'=> $city->mobiles_count,  // Laravel 自动注入的属性
        ];
    });

    return response()->json($response);
}

✅ 优势总结:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » Laravel 中使用 withCount() 预加载关联计数实现高效查询-php教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995687+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995688+
  • 本周更新: 0+
  • 最后更新: 2026-03-16