#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);