#3分钟短文 | Laravel 根据关联模型条目数量排序,怎么做?
引言
在laravel中我们使用模型操作数据库表,同时使用 hasOne belongTo hasMany 等关联关系模型 建立不同模型之间的关联。对于简单的查询操作这完全应付的来。 可是现实的业务需求往往充满变数,今天我们就说一个需求, 根据关联模型的数量进行排序,应该如何写代码。
学习时间
我们用实例进行解释,首先是表结构,为了简化操作,只罗列出主要的字段。首先是 hackathons 表的两个字段:
- id
- name
- begins
- ends
- description
然后是 user 表的字段:
- id
- name
还有一个关联表 hackathon_user 字段:
- hackathons_id
- user_id
好了,基础数据已经建立,接着我们使用laravel的模型操作数据库表。首先声明 Hackathons 模型:
|
|
其中有一个 Type 模型因为与本文所讨论问题无关,因此不予列出。接着定义关联表的模型:
|
|
这就是我们需要的基础类,接着说如何排序。如果不考虑性能问题,或者筛选出的数据量还不足以让我们考虑到性能问题, 那么可以先把结果数据集整个返回,然后使用 laravel collection 集合进行排序和操作。 代码写起来像下面这样:
|
|
注意在使用 get 获取所有的结果数据集之后,调用的是Collection类的 sortBy 方式,默认是升序排列。 这个方法在数据量小的时候,没什么问题。
如果你的数据量很大,动辄几十万条,那么上面的 get 方法,万万是不能用的,这会大大地增加MySQL与服务器之间的数据传输压力。 所以,我们需要在MySQL层面,尽量解决这个问题。
聚合查询也是关系型数据库的强项,所以我们需要的是把聚合查询用laravel实现出来。
laravel 5.3 及以上,我们可以使用 withCount 进行关联类的聚合查询了,代码只需一行:
|
|
注意laravel自动生成的统计类的字段名不能写错。
还有一种方法,就是不使用关联模型,而该用表连接,绕过模型定义的关联关系进行查询。我们直接贴出实现代码:
|
|
唯一需要注意的是 groupBy 的字段,与 select 所指定的聚合函数。
写在最后
本文通过三种方式实现了laravel中模型的聚合查询排序,其中两种是使用关联关系方式组合查询条件, 一种是直接表操作,使用左连接连接表数据。 从写作方式和可维护上讲,我们推荐第二种;但对于业务特殊情况,比如数据库的索引,我们推荐第三种更接近原生的方式, 调优的SQL语句很有杀伤力!
Happy coding :-)
我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者。