Laravel 4.1: Как разбивать красноречивые нетерпеливые отношения?

Был вопрос о старых 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,

  1. но есть ли возможность использовать нетерпеливые загруженные отношения, которые разбиты на страницы? И как это можно сделать?

Чтобы прояснить что-то: пагулящие нетерпеливые отношения – это несколько заблуждение. Точка нетерпеливой загрузки заключается в том, чтобы извлекать все отношения в виде нескольких запросов, как вы можете. Если вы хотите получить 10 тем, все из которых содержат 35 сообщений, вам понадобятся только два запроса. Милая!

Тем не менее, разбиение на страницы с нетерпением загруженных отношений не сработает. Рассмотрим два сценария, когда происходит активная загрузка:

  1. Вы хотите получить и перечислить темы и, возможно, перечислить первые пять сообщений для каждой темы. Большой! Желательная загрузка идеальна. Теперь вы не захотите разбивать страницы, загруженные с нетерпением на такой странице, так что это не имеет значения.

  2. Вы загружаете одну тему и хотите разбивать страницы для этой темы. Большой! Относительно легко сделать. Однако, если вы уже загрузили все сообщения, относящиеся к этой теме, вы просто потенциально получили много дополнительных ресурсов, которые вам не нужны. Поэтому нетерпевая загрузка на самом деле вредит вам.

Тем не менее , есть два возможных решения:

Вариант 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

Надеюсь это поможет