温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-12-28 16:55:12 来源:亿速云 阅读:314 作者:小新 栏目:大数据

这篇文章主要介绍了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如何根据关联模型条目数量排序”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI