Как мне вернуть Eloqent модели вместо массива при использовании LengthAwarePaginator?

#php #laravel

#php #laravel

Вопрос:

Некоторый контекст

У меня есть страница, на которой мне нужно отобразить разбитый на страницы список сообщений. До сих пор мой контроллер был:

 $posts = Post::whereNotNull('published_at')->paginate(10);

return view('index', compact('posts'));
 

Тогда, на мой взгляд index.blade.php , я мог бы сделать что-то вроде:

 @foreach ($posts as $post)
    <h3 class="mb-4"><a href="{{$post->link}}">{{$post->title}}</a></h3>
@endforeach
 

Теперь мне нужно ограничить запрос только 50 сообщениями. Однако приведенный ниже фрагмент кода завершается с ошибкой, поскольку разбиение на страницы laravel использует внутреннее ограничение, которое переопределяет мой собственный запрос. Итак, я все равно получаю все записи в базе данных:

 $posts = Post::whereNotNull('published_at')->limit(50)->paginate(10);

return view('index', compact('posts'));
 

Моя проблема

Поэтому я использовал IlluminatePaginationLengthAwarePaginator для создания ручного разбиения на страницы. Итак, теперь мой контроллер выглядит так:

 $page = LengthAwarePaginator::resolveCurrentPage();

$perPage = 10;

$results = Post::whereNotNull('published_at')->limit(50)->get();

$items = array_slice($results->toArray(), ($page - 1) * $perPage, $perPage);

$posts = new LengthAwarePaginator($items, count($results), $perPage, $page);

return view('index', compact('posts'));
 

Мой index.blade.php остается прежним. Но теперь, если я попытаюсь зайти на страницу, я получаю сообщение об ошибке типа

 Trying to get property 'link' of non-object 
 

Оказывается, что в моем index.blade.php случае каждый $post $posts элемент является массивом, а не экземпляром Post класса.

Мой вопрос

Как я могу заставить каждый $post из $posts них быть объектом (экземпляром Post класса)? В идеале я хотел бы, чтобы представление работало так, как оно есть, без изменений.

Я ценю все усилия.

Комментарии:

1. Вы тот, кто выполняет преобразование, запустив $results->toArray() .

2. Да, к сожалению, документы Laravel указали мне на это направление.

Ответ №1:

Collection Объект Laravel имеет множество встроенных методов, которые действуют как массив. Вместо преобразования ваших результатов в массив и использования array_slice :

 $items = array_slice($results->toArray(), ($page - 1) * $perPage, $perPage);
 

Вы должны использовать Collection::slice() метод.

 $items = $results->slice(($page - 1) * $perPage, $perPage);