[英]Laravel Eloquent: get unique models between relationships
我有这样的场景:
我有User
model 与Post
model 具有OneToMany关系。 我有一个标签Hashtag
与Post
model 具有OneToMany关系。
回顾:一个用户有很多帖子,一个帖子属于一个标签,一个标签有很多帖子。
我只想获取主题标签的唯一用户记录。
我能够以不可扩展的方式做到这一点(首先获取所有帖子,然后按用户 ID 迭代过滤),但我需要保持大记录数的可扩展性。
编辑:我在 Laravel 文档中看到了部分解决方案。 Laravel eloquent 有一个名为unique()的方法。
使用该方法,我可以指定在查询中应该是唯一的参数。
在我的情况下,通过:
$users = $hashtag->posts->unique('user_id');
但我不能以这种方式对查询进行分页......
有没有人解决这个问题?
尝试使用DISTINCT
$users = $hashtag->posts()->selectRaw('DISTINCT(user_id) AS unique_user_id')->paginate(10);
或者
使用groupBy()
$users = $hashtag->posts()->groupBy('name')->select('user_id')->paginate(10);
您必须对主要的 model 调用者进行分页。
我不知道这是否可以重现您的实际场景,但让我们看看这个例子:
假设您有model 标签
所以假设代码可能是这样的:
$users = DB::table('hashtags AS tags')
->select('tags.*')
->join('[posts AS post','post.id','=','tags.id')
->distinct()
->paginate(5, ['tags.*']);
我不知道您的查询是否会非常准确,但是为此,我相信最好的方法是您进行原始查询,看起来这对您的数据库和操作来说代价高昂,但是您可以解决此方法索引和分区数据库。
始终记住 eloquent 有时即使我们正在构建连接查询,对您的数据库而言可能会更加昂贵。
由于您担心可伸缩性,因此最好的办法是编写一个视图来获取具有适当索引和分区的所有数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.