如何在过滤器中使用Laravel分页

时间:2018-09-25 15:14:52

标签: database laravel laravel-5 eloquent laravel-pagination

我在帖子模型中具有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

无法看到表中的列是访问者

2 个答案:

答案 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'));