Был вопрос о старых L3 нетерпеливых загруженных папках, не используя красноречивого. Но я хочу использовать красноречие, чтобы получить нетерпеливые отношения с разбиением на страницы.
Основная модель: тема, в которой есть одно отношение к сообщениям , поэтому в одной теме есть много сообщений . Я получаю все данные с помощью этой функции:
public function findById($id) { return $this->topic->with('posts', 'posts.user', 'posts.user.profile') ->find($id); }
И позже я делаю цикл для отображения всех результатов, но они не разбиты на страницы:
@foreach($topic->posts as $post) ... unpaginated content ... @endforeach
Итак, я могу сделать обходной путь и выбрать отдельно все сообщения, у которых есть $ id темы, и использовать -> paginate () вместо -> get () и получить разбитые $ pots,
Чтобы прояснить что-то: пагулящие нетерпеливые отношения – это несколько заблуждение. Точка нетерпеливой загрузки заключается в том, чтобы извлекать все отношения в виде нескольких запросов, как вы можете. Если вы хотите получить 10 тем, все из которых содержат 35 сообщений, вам понадобятся только два запроса. Милая!
Тем не менее, разбиение на страницы с нетерпением загруженных отношений не сработает. Рассмотрим два сценария, когда происходит активная загрузка:
Вы хотите получить и перечислить темы и, возможно, перечислить первые пять сообщений для каждой темы. Большой! Желательная загрузка идеальна. Теперь вы не захотите разбивать страницы, загруженные с нетерпением на такой странице, так что это не имеет значения.
Вы загружаете одну тему и хотите разбивать страницы для этой темы. Большой! Относительно легко сделать. Однако, если вы уже загрузили все сообщения, относящиеся к этой теме, вы просто потенциально получили много дополнительных ресурсов, которые вам не нужны. Поэтому нетерпевая загрузка на самом деле вредит вам.
Тем не менее , есть два возможных решения:
Вариант 1. Создайте пользовательский аксессуар, который разбивает страницы на отношения «Красноречивое».
/** * Paginated posts accessor. Access via $topic->posts_paginated * * @return \Illuminate\Pagination\Paginator */ public function getPostsPaginatedAttribute() { return $this->posts()->paginate(10); }
Плюсы: Paginates очень легко; не мешает нормальной связи с сообщениями.
Минусы: загруженные сообщения не будут влиять на этот аксессор; при запуске он создаст два дополнительных запроса поверх загруженного загруженного запроса.
Вариант 2: разбиение на страницы сообщений, возвращаемых отношениями, загружаемыми с нетерпением.
/** * Paginated posts accessor. Access via $topic->posts_paginated * * @return \Illuminate\Pagination\Paginator */ public function getPostsPaginatedAttribute() { $posts = $this->posts; // Note that you will need to slice the correct array elements yourself. // The paginator class will not do that for you. return \Paginator::make($posts, $posts->count(), 10); }
Плюсы: использует нетерпеливые отношения; не создает дополнительных запросов.
Минусы: необходимо извлекать ВСЕ элементы независимо от текущей страницы (медленные); необходимо вручную создавать элементы текущей страницы.
Вы можете взглянуть на следующее:
$category = 'Laravel'; $posts = Post::with('user', 'category')->whereHas('category', function($query) use ($category) { $query->where('name', '=', $category); })->paginate();
Автор: Zenry: Источник: http://laravel.io/forum/02-25-2014-eager-loading-with-constrains-load-post-based-on-category-name
Надеюсь это поможет