Что делать, если на коллекцию не допускается разбиение на страницы? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть две сущности: 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 голосов
/ 13 сентября 2018
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);

Вы можете просто оптимизировать свой запрос, чтобы вернуть то, что вы хотите, выбрав то, что вам нужно.

Это должно быть еще быстрее.

0 голосов
/ 13 сентября 2018

Вы можете создать свою собственную нумерацию страниц с помощью 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 возвращает объект пагинации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...