千家信息网

Laravel如何根据关联模型条目数量排序

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了Laravel如何根据关联模型条目数量排序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。引言在laravel中我们使
千家信息网最后更新 2026年11月03日Laravel如何根据关联模型条目数量排序

这篇文章主要介绍了Laravel如何根据关联模型条目数量排序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

引言

在laravel中我们使用模型操作数据库表,同时使用 hasOne belongTo hasMany 等关联关系模型 建立不同模型之间的关联。对于简单的查询操作这完全应付的来。

可是现实的业务需求往往充满变数,今天我们就说一个需求, 根据关联模型的数量进行排序,应该如何写代码。

学习时间

我们用实例进行解释,首先是表结构,为了简化操作,只罗列出主要的字段。首先是 hackathons 表的两个字段:

  • id

  • name

  • begins

  • ends

  • description

然后是 user 表的字段:

  • id

  • name

还有一个关联表 hackathon_user 字段:

  • hackathons_id

  • user_id

好了,基础数据已经建立,接着我们使用laravel的模型操作数据库表。首先声明 Hackathons 模型:

class Hackathon extends Model{protected $fillable = ['name', 'begins', 'ends', 'description'];protected $table = 'hackathons';public function owner(){return $this->belongsToMany('User', 'hackathon_owner');}public function participants(){return $this->belongsToMany('User');}public function type(){return $this->belongsToMany('Type');}}

其中有一个 Type 模型因为与本文所讨论问题无关,因此不予列出。接着定义关联表的模型:

class HackathonParticipant extends Model{protected $fillable = ['hackathon_id', 'user_id'];protected $table = 'hackathon_user';public function user(){return $this->belongsTo('User', 'user_id');}public function hackathon(){return $this->belongsTo('Hackathon', 'hackathon_id');}}

这就是我们需要的基础类,接着说如何排序。如果不考虑性能问题,或者筛选出的数据量还不足以让我们考虑到性能问题, 那么可以先把结果数据集整个返回,然后使用 laravel collection 集合进行排序和操作。代码写起来像下面这样:

$hackathons = Hackathon::with('participants')->get()->sortBy(function($hackathon){return $hackathon->participants->count();});

注意在使用 get 获取所有的结果数据集之后,调用的是Collection类的 sortBy 方式,默认是升序排列。这个方法在数据量小的时候,没什么问题。

如果你的数据量很大,动辄几十万条,那么上面的 get 方法,万万是不能用的,这会大大地增加MySQL与服务器之间的数据传输压力。所以,我们需要在MySQL层面,尽量解决这个问题。

聚合查询也是关系型数据库的强项,所以我们需要的是把聚合查询用laravel实现出来。

laravel 5.3 及以上,我们可以使用 withCount 进行关联类的聚合查询了,代码只需一行:

Hackathon::withCount('participants')->orderBy('participants_count', 'desc')->paginate(10);

注意laravel自动生成的统计类的字段名不能写错。

还有一种方法,就是不使用关联模型,而该用表连接,绕过模型定义的关联关系进行查询。我们直接贴出实现代码:

$hackathons = Hackathon::leftJoin('hackathon_user','hackathon.id','=','hackathon_user.hackathon_id')->selectRaw('hackathon.*, count(hackathon_user.hackathon_id) AS `count`')->groupBy('hackathon.id')->orderBy('count','DESC')->paginate(5);

唯一需要注意的是 groupBy 的字段,与 select 所指定的聚合函数。

感谢你能够认真阅读完这篇文章,希望小编分享的"Laravel如何根据关联模型条目数量排序"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

模型 关联 数据 字段 排序 问题 查询 代码 篇文章 数量 数据库 方法 条目 之间 同时 基础 就是 性能 结果 需求 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司简介 互联网科技公司华为 科技互联网龙头 新华互联网科技学院 互联网科技卖菜 重庆互联网络科技 互联网科技未来 互联网与未来科技 浩特互联网科技 温州喔噻互联网科技有限公司 互联网教育科技公司vipkid 北京华百购互联网科技有限公司 成都互联网科技公司工作好不好 科技赋能视角下互联网保险发展 滨湖区互联网智能科技产品有哪些 宇信科技在杭州互联网排第几 济南小医互联网科技有限公司招聘 保山浩联互联网科技有限公司 银川新华互联网科技学校招聘 如何强化互联网金融科技 鸠鸠互联网科技 互联网巨头反垄断金融科技 极限挑战互联网科技 一五八零互联网科技 盛创互联网科技有限公司 深圳国际航运科技和互联网 东莞新华互联网科技学校 深圳无忧互联网科技 皮皮虾互联网科技有限公司 银川新华互联网科技学校原画
0