0

0

Laravel Eloquent 教程:高效统计关联模型数量(以分类文章为例)

霞舞

霞舞

发布时间:2025-11-14 13:55:30

|

288人浏览过

|

来源于php中文网

原创

Laravel Eloquent 教程:高效统计关联模型数量(以分类文章为例)

本教程将详细介绍如何在 laravel 8 中使用 eloquent orm 高效统计每个分类下的文章数量。通过定义模型关联和利用 `withcount` 方法,开发者可以避免手动编写复杂的 sql 查询,以简洁、可读性强的方式获取每个分类及其关联文章的总数,极大提升开发效率和代码质量。

在 Laravel 应用开发中,统计关联模型的数据量是一个非常常见的需求,例如统计每个分类下的文章数量、每个用户发布的评论数量等。虽然可以通过 DB 查询构造器结合 JOIN 和 GROUP BY 来实现,但 Laravel 的 Eloquent ORM 提供了更优雅、更高效的解决方案,即利用模型关系和 withCount 方法。

1. 定义数据库表结构

为了演示,我们假设存在以下两个表:

  • categories 表:存储文章分类信息。
    • id (主键)
    • name (分类名称)
    • ...其他字段
  • posts 表:存储文章信息。
    • id (主键)
    • category_id (外键,关联 categories.id)
    • ...其他字段

2. 创建并定义 Eloquent 模型

首先,我们需要为这两个表创建对应的 Eloquent 模型。

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

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    use HasFactory;

    protected $fillable = ['name'];

    /**
     * 一个分类可以有多个文章。
     */
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}
// app/Models/Post.php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'content', 'category_id'];

    /**
     * 一篇文章属于一个分类。
     */
    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}

在 Category 模型中,我们定义了一个 posts 方法,它返回 hasMany(Post::class),表示一个 Category 可以拥有多个 Post。这是实现统计关联数量的关键。

3. 使用 withCount 方法统计关联数量

Laravel Eloquent 提供的 withCount 方法是统计关联模型数量的利器。它会在查询结果中为每个父模型实例添加一个 [relation]_count 属性,其中包含关联模型的数量。

要统计每个分类下的文章数量,只需在查询 Category 模型时使用 withCount('posts'):

HaiSnap
HaiSnap

一站式AI应用开发和部署工具

下载
use App\Models\Category;

$categoriesWithPostCount = Category::withCount('posts')->get();

foreach ($categoriesWithPostCount as $category) {
    echo "分类名称: " . $category->name . ",文章数量: " . $category->posts_count . "\n";
}

代码解释:

  • Category::withCount('posts'):这条语句指示 Eloquent 在获取 Category 模型时,同时统计每个分类关联的 posts 数量。
  • get():执行查询并返回一个 Category 模型的集合。
  • $category->posts_count:对于集合中的每一个 Category 模型实例,withCount('posts') 会自动添加一个名为 posts_count 的属性,其值就是该分类下关联文章的总数。这个属性的命名规则是:关联方法名(此处为 posts)后加上 _count。

4. 优势与注意事项

4.1 优势

  • 简洁性: 相比于手动编写 JOIN 和 GROUP BY 的 SQL 语句,withCount 方法的代码更加简洁、易读。
  • 性能优化: withCount 在底层会生成一条高效的 SQL 查询,通常是使用子查询或左连接,避免了加载所有关联模型到内存中再进行计数,从而提高了性能。
  • 可维护性: 将业务逻辑封装在 Eloquent 模型中,提高了代码的可维护性和复用性。
  • 灵活性: 可以链式调用其他 Eloquent 查询方法,如 where、orderBy 等,进一步筛选或排序结果。

4.2 带有条件的计数

如果你需要统计满足特定条件的关联模型数量,可以在 withCount 中传入一个闭包函数:

use App\Models\Category;

// 统计每个分类下状态为 'published' 的文章数量
$categoriesWithPublishedPostCount = Category::withCount(['posts' => function ($query) {
    $query->where('status', 'published');
}])->get();

foreach ($categoriesWithPublishedPostCount as $category) {
    echo "分类名称: " . $category->name . ",已发布文章数量: " . $category->posts_count . "\n";
}

在这个例子中,posts_count 将只包含 status 字段为 'published' 的文章数量。

4.3 多个关联计数

你也可以同时统计多个关联模型的数量:

use App\Models\Category;

// 假设 Category 模型还有一个 comments 关联
$categoriesWithCounts = Category::withCount(['posts', 'comments'])->get();

foreach ($categoriesWithCounts as $category) {
    echo "分类名称: " . $category->name . ",文章数量: " . $category->posts_count . ",评论数量: " . $category->comments_count . "\n";
}

总结

通过本教程,我们学习了如何在 Laravel 8 中利用 Eloquent ORM 的 withCount 方法高效地统计关联模型的数量。这种方法不仅使代码更加简洁和富有表现力,而且在性能上也进行了优化,是处理此类需求的首选方案。掌握 withCount 及其条件计数功能,将极大提升你在 Laravel 项目中的开发效率和代码质量。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

313

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

270

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

363

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

363

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

80

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

63

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

62

2025.08.05

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

674

2023.10.12

excel制作动态图表教程
excel制作动态图表教程

本专题整合了excel制作动态图表相关教程,阅读专题下面的文章了解更多详细教程。

30

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号