集合上不允许使用分页器时该怎么办?

时间:2018-09-13 06:24:44

标签: php laravel

我有两个实体:Post(帖子)和Tag(标签)。他们俩都是多对多关系。因此,我有一个名为PostTag(post_tag)的数据透视表。我想列出所有属于作者已登录的帖子的所有标签 [包括 a)数据透视表 b)帖子标题] 在用户中。所以我做了这样的事情:

$tags = collect();
$posts = Post::where('user_id', auth()->id())->with('tags')->get();
$posts->each(function($post, $key) use ($tags){
    $post->tags->each(function($tag, $key) use ($tags, $post) {
        $tag->post_title = $post->title;
        $tags->push($tag);
    });
});
return $tags;

但是,我还需要对结果进行分页。所以我尝试返回此值:

return $tags->paginate(10);

但是分页不是Collection(也许是Builder)的方法

关系方法为:

// Post.php
public function tags() {
    return $this->belongsToMany(Tag::class)->withPivot('updated_at');
}
// Tag.php
public function posts(){
    return $this->belongsToMany(Post::class);
}

我觉得必须有一些我可能不知道的更简单的方法:

PostTag::someQueryThatFetchesThoseTagsWithPostTitle();
// If I could do something like this, paginate() would have been available

2 个答案:

答案 0 :(得分:2)

Tags::query()->where('posts.user_id', auth()->id())
             ->join('post_tag', 'post_tag.tag_id', '=', 'tags.id')
             ->join('posts', 'post_tag.post_id', '=', 'posts.id')
             ->selectRaw('tags.*, posts.title as post_title')
             ->paginate(10);

您只需优化查询即可返回想要选择的内容。

这应该更快。

答案 1 :(得分:1)

您有时可以使用我在项目中使用的这段代码,用LengthAwarePaginator创建自己的分页。

//Get current page form url e.g. &page=6
$currentPage = LengthAwarePaginator::resolveCurrentPage();
//Number of results in pagination
$paginate = 10;

//Slice the collection to get the items to display in current page
$currentPageSearchResults = $tags->slice(($currentPage - 1) * $paginate, $paginate)->all();

//Create our paginator and pass it to the view
$paginatedSearchResults = new LengthAwarePaginator($currentPageSearchResults, $tags->count(), $paginate);

$paginatedSearchResults返回分页对象的地方。