Страничный вывод из БД
Использование метода "paginate" - это простейший способ создания постраничной навигации. Его можно использовать как на запросе Eloquent, таки на объекте конструктора запросов. Этот метод автоматически задаёт пределы и отступы текущей страницы, используя GET параметры "page". При этом ссылки для постраничной навигации создаются автоматически. Приведём пример использования:<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller {
public function index() {
$elementCount = 10; // количество результатов на странице
$users = DB::table('users')->paginate($elementCount);
return view('user.index', ['users' => $users]);
}
}
?>
Этот код сделает выборку из 10 элементов. если же необходимо сделать только ссылки "Далее" и "Назад", а не распечатывать цифры "1, 2, 3, 4, ...", то можно воспользоваться методом
<?php
$users = DB::table('users')->simplePaginate($elementCount);
?>
Страничный вывод с помощью Eloquent
Попробуем переписать предыдущий пример, используя модель Eloquent. Код будет совпадать за исключением строки запроса данных:<?php
$users = App\User::paginate($elementCount);
?>
Конечно, можно добавлять и другие методы для ограничения выборки до вызова метода "paginate". Также можно использовать и метод "simplePaginate":
<?php
$users = User::where('id', '>', 4)->paginate($elementCount);
$users = User::where('id', '>', 7)->simplePaginate($elementCount);
?>
Создание постраничной навигации вручную
Иногда приходится создавать экземпляры страничного вывода вручную. Это делается с помощью экземпляра классаIlluminate\Pagination\Paginator
или Illuminate\Pagination\LengthAwarePaginator
. Для первого класса не нужно определять общее количество элементов в выборке. Поэтому у него нет метода для получения порядкового номера последней страницы. А второй класс наоборот требует определения общего количества элементов в наборе.Если перефразировать, то "Paginator" работает как метод "simplePaginate" на Eloquent, а "LengthAwarePaginator" работает как "paginate".
Вывод HTML кода постраничной навигации
В результате использования методов "paginate" и "simplePaginate" полуается экземпляр страничного вывода. Для метода "paginate" это экземплярLengthAwarePaginator
. А для метода "simplePaginate" - Paginator
. К самим экземплярам можно так же обращаться как к массивам. Но сами объекты содержат методы для вывода результата. Приведём пример вывода навигации с использованием Blade:
<div class="container">
@foreach ($users as $user)
{{ $user->name }}
@endforeach
</div>
{{ $users->links() }}
Тот же пример, но с использованием PHP и метода "render":
<div class="container">
<?php foreach ($users as $user){ ?>
<?php echo $user->name; ?>
<?php } ?>
</div>
<?php echo $users->render(); ?>
Параметры в ссылках
С помощью метода "appends" можно модифицировать ссылки постраничной навигации, добавляя к ним GET параметры. Этот метода принимает в качестве аргумента массив ключ-значение GET параметров, которые необходимо установить.{{ $users->appends(['sort' => 'id'])->links() }}
В результате получится ссылка постраничной навигации вида:
https://mousedc.ru/?page=2&sort=id
Если нужно добавить хеш фрагмент (часть ссылки после знака "#"), то используйте метод fragment:
{{ $users->fragment('food')->links() }}
В результате ссылка будет выглядеть так:
https://mousedc.ru/?page=2#food