Как использовать пагинацию с помощью фильтра - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть 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

может не указывать столбец в таблице, это Accessor

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Вы можете добавить следующий код, определите после $post

$post->appends($request->only('posted_type'));
0 голосов
/ 25 сентября 2018

Прежде всего, я надеюсь, что вы знаете, что вы делаете.Предполагая, что вам нужно получить результаты с полем 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, чтобы сделатьуверен, что будет сформирован правильный запрос.

В противном случае вы должны использовать:

$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;
   })
);

Однако очень маловероятно, что 2-й способ лучше в вашем случае.Предполагая, что у вас есть 1 миллион совпадающих записей, а затем для них can_see установлено значение true, а для остальных - false, это приведет к тому, что вы получите 1 миллион записей из базы данных, а затем отфильтруете только 10 изим, что бы убить производительность для вашего приложения.

...