我在帖子模型中具有getCanSeeAttribute
功能,我尝试使用filter()
进行分页发布
$posts = Post::where(function ($query1) use ($users) {
$query1->where('posted_type', 'user')->whereIn('posted_id', $users);
})
->orWhere(function ($query2) use ($stores) {
$query2->where('posted_type', 'store')->whereIn('posted_id', $stores);
})
->with('likes', 'postable')
->withCount('comments', 'likes')
->latest()->paginate($paginate)->filter(function($post){
return $post->can_see == true;
});
问题是当我使用过滤器时,它仅获取数据属性,但是我需要所有分页属性。
first_page_url": "http://localhost:8000/api/timeline?page=1",
"from": 1,
"last_page": 1,
"last_page_url": "http://localhost:8000/api/timeline?page=1",
"next_page_url": null,
"path": "http://localhost:8000/api/timeline",
"per_page": 10,
"prev_page_url": null,
"to": 6,
"total": 6
无法看到表中的列是访问者
答案 0 :(得分:0)
首先,我希望您知道您在做什么。假设您需要获取将can_see
字段设置为true的结果,则应该使用:
$posts = Post::where('can_see', true)
->where(function($q) {
$q->where(function ($query1) use ($users) {
$query1->where('posted_type', 'user')->whereIn('posted_id', $users);
})->orWhere(function ($query2) use ($stores) {
$query2->where('posted_type', 'store')->whereIn('posted_id', $stores);
})
})->with('likes', 'postable')
->withCount('comments', 'likes')
->latest()
->paginate($paginate);
如您所见,我另外在附加的where
闭包中(在..或Where处)包装以确保将生成有效查询。
否则,您应该使用:
$posts = Post::where(function($q) {
$q->where(function ($query1) use ($users) {
$query1->where('posted_type', 'user')->whereIn('posted_id', $users);
})->orWhere(function ($query2) use ($stores) {
$query2->where('posted_type', 'store')->whereIn('posted_id', $stores);
})
})->with('likes', 'postable')
->withCount('comments', 'likes')
->latest()
->paginate($paginate);
$posts = $posts->setCollection($posts->getCollection()->filter(function($post){
return $post->can_see == true;
})
);
但是,根据您的情况,第二种方法不太可能是更好的方法。假设您有100万条匹配记录,然后将can_see
设置为true,其余的将其设置为false,这将导致您从数据库中获得100万条记录,然后仅过滤其中有10个将成为您应用程序的性能杀手。
答案 1 :(得分:0)
您可以添加以下代码,在$post
之后定义
$post->appends($request->only('posted_type'));