我有两个实体: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
答案 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
返回分页对象的地方。