Php Laravel雄辩:在关系之间建立独特的模型

Php Laravel雄辩:在关系之间建立独特的模型,php,jquery,mysql,laravel,eloquent,Php,Jquery,Mysql,Laravel,Eloquent,我有这样一个场景: $users = DB::table('hashtags AS tags') ->select('tags.*') ->join('[posts AS post','post.id','=','tags.id') ->distinct() ->paginate(5, ['tags.*']); 我有User模型,它与Post模型有OneToMany关系。 我有一个Hashtag模型,它与Post模型有OneToMany

我有这样一个场景:

$users = DB::table('hashtags AS tags')
    ->select('tags.*')
    ->join('[posts AS post','post.id','=','tags.id')
    ->distinct()
    ->paginate(5, ['tags.*']);

我有
User
模型,它与
Post
模型有OneToMany关系。 我有一个
Hashtag
模型,它与
Post
模型有OneToMany关系

概述:ONE用户拥有多篇帖子,ONE帖子属于ONE标签,ONE标签拥有多篇帖子

我只想获取标签的唯一用户记录

我能够以不可伸缩的方式(首先获取所有帖子,然后按用户id迭代过滤),但我需要保持大记录数的可伸缩性

编辑:我在Laravel文档中看到了部分解决方案。 Laravel eloquent有一个方法叫做

使用该方法,我可以指定在查询中应该是唯一的参数

在我的例子中,我用以下方法解决了这个问题:

$users=$hashtag->posts->unique('user_id')

但我不能用这种方式分页查询


有人能解决这个问题吗?

试着使用
DISTINCT

$users=$hashtag->posts()->selectRaw('DISTINCT(user\u id)AS unique\u user\u id')->分页(10);

使用
groupBy()

$users=$hashtag->posts()->groupBy('name')->select('user_id')->paginate(10);

您必须对主模型调用者进行分页

我不知道这是否能再现您的实际场景,但让我们看看这个例子:

假设您有模型标签

假设代码可以是这样的:

$users = DB::table('hashtags AS tags')
    ->select('tags.*')
    ->join('[posts AS post','post.id','=','tags.id')
    ->distinct()
    ->paginate(5, ['tags.*']);

我不知道您的查询是否会非常准确,但对于这一点,我相信最好的方法是您执行原始查询,这可能会给您的数据库和操作带来成本,但您可以围绕这种方法对数据库进行索引和分区

有时,即使在构建连接查询时,也要始终记住雄辩的语句,这可能会给数据库带来更大的代价

因为您担心可伸缩性,所以最好也写一个视图,通过适当的索引和分区获取所有数据