Laravel пагинация

Ромчик
0

Пагинация в Laravel Доброго времени суток. В данной статье мы поговорим о пагинации в Laravel. Пагинация в Laravel работает прямо из коробки и настраивается очень легко. В статье мы настроим подключение к базе данных, создадим миграцию, создадим модель, затем с помощью Seeding добавим данных в таблицу, создадим контроллер для вывода этих данных и вьюшку для отображения данных. А затем добавим пагинацию. И в завершении рассмотрим, кастомизировать вид постраничной навигации (создадим шаблон для отображения пагинации в Laravel). Что такое пагинация или постраничное отображение данных я не буду описывать. Надеюсь заинтриговал? Тогда приступим…

У нас есть установленный Laravel версии 5.4

Версия Laravel

Есть настроенный виртуальный хост, по адресу pagination.loc

Виртуальный хост с установленным Laravel

Есть сервер MySQL с базой данных «pagination» без таблиц

Пустая база данных для Laravel

Мы готовы приступить к созданию сайта.

Настройка Laravel

Нам необходимо настроить Laravel. Открываем файл .env, который находится в корне нашего проекта. И меняем:

  • DB_DATABASE – вместо homestead пишем название нашей базы, в моем случае pagination
  • DB_USERNAME – вместо homestead пишем логин для подключения к нашей базе, в моем случае root
  • DB_PASSWORD – вместо secret пишем пароль для подключения к базе данных, в моем случае я оставляю пустым (нет пароля)

Сохраняем.

Создание и запуск миграции в Laravel

Открываем консоль и выполняем команду:


php artisan make:migration creates_articles_table 

выполнение команды make:migration

Миграцию создали. Теперь давайте отредактируем ее. Открываем файл <дата>_<номер>_creates_articles_table.php, которая находится в database\migrations\

И добавим в него следующий код:


<?php 
use Illuminate\Support\Facades\Schema; 
use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 
class CreatesArticlesTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() { 
        Schema::create('articles', function (Blueprint $table) { 
            $table->increments('id');
            $table->string('title', 100) ->unique();
            $table->string('text');
            $table->timestamps();
        });
    }

    /**
    * Reverse the migrations.
    *
    * @return void
    */
    public function down()
    {
        Schema::dropIfExists('articles');
    }
}

Кратко поясню. Есть два метода up и down. Первый выполняется, когда мы запускаем миграцию, а второй, когда откатываем миграцию.

При выполнении метода будет создана таблица articles с полями:

  • id – автоувеличение
  • title – тип varchar длинной 100
  • text – тип text
  • created_at – тип timestamp
  • updated_at – тип timestamp

При откате миграции, таблица articles будет удалена (если она существует)

Теперь мы можем запустить миграцию.  Но перед запуском давайте переименуем две миграции, они нам не нужны:

  • php в 2014_10_12_000000_create_users_table.txt
  • php в 2014_10_12_100000_create_password_resets_table.txt

Теперь выполним команду:


php artisan migrate

выполнение команды migrate

Миграция выполнена. Давайте проверим базу данных. Да, видим, что у нас появилось две таблицы наша articles и migrations (служебная таблица для учета миграций)

Таблицы в БД, после выполнения миграции

Отлично, мы с вами создали миграцию и запустили ее. В результате в нашей базе создалась таблица с заданными полями.

Создание Seeder

В Laravel есть метод seeding, который позволяет заполнить нашу базу данных  тестовыми данными.

Создадим Seeder.


php artisan make:seeder ArticlesTableSeeder

выполнение команды make:seeder

Перейдем к редактированию нашего seeder.


<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class ArticlesTableSeeder extends Seeder
{
    /**
    * Run the database seeds.
    *
    * @return void
    */
    public function run()
    {
        $i=1;
        while ($i<26){ DB::table('articles')->insert([
                'title' => 'Заголовок для статьи ' .$i,
                'text' => str_random(100),
            ]);
        $i++;
    }
}

}

При запуске данного seeder в нашей таблице будет создано 25 записей.

Теперь откроем файл DatabaseSeeder.php, который находится database\seeds\ и в метод run, добавим наш класс, вот код DatabaseSeeder.php


<?php 
use Illuminate\Database\Seeder; 
class DatabaseSeeder extends Seeder { 
    /** 
    * Run the database seeds. 
    * 
    * @return void 
    */ 
    public function run() { 
        $this->call(ArticlesTableSeeder::class);
    }
}

Теперь можно запустить добавление данных, выполнив команду в консоли:


php artisan db:seed

выполнение команды db:seed

Команда выполнена. Давайте перейдем к базе данных и посмотрим таблицу articles.

Отлично, в таблице articles у нас появилось 25 записей.

статьи в базе данных

 

Создание модели в Laravel

Основная задача модели – это чтение или запись данных таблицы.

Для того, чтобы создать модель в Laravel достаточно в консоли выполнить следующую команду:


php artisan make:model Article

выполнение команды make:model

Модель создана.

Создание контроллера в Laravel

Давайте создадим контроллер, который будет получать из модели Article все данные в таблице и передавать их во вьюшку.

Для того, чтобы создать контроллер в консоли необходимо выполнить следующую команду:


php artisan make:controller ArticleController

Контроллер создан

выполнение команды make:controller

Теперь перейдем к его редактированию. Напомню, контроллеры нашего приложения находятся в app\Http\Controllers\ (это по умолчанию)

И добавим в него следующий код:


<?php 
namespace App\Http\Controllers; 
use Illuminate\Http\Request; 
use Article; 
class ArticleController extends Controller 
{ 
    public function index() { 
        $articles = Article::all(); 
        return view('index',['articles' => $articles]);
    }
}

В данном контроллере всего один метод index().

Теперь нам надо создать view, которая будет отображать все наши данные.

Все вьюшки лежат в resources\views\ . В этой папке и создадим нашу вьюшку index.blade.php Со следующим кодом:


<!DOCTYPE html>

<html lang="{{ config('app.locale') }}">

<head>

<meta charset="utf-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1">

<title>Laravel</title>

<!-- Fonts -->

<link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css">

<!-- Styles -->

<style>

html, body {

background-color: #fff;

color: #636b6f;

font-family: 'Raleway', sans-serif;

font-weight: 100;

height: 100vh;

margin: 0;

}

.full-height {

height: 100vh;

}

.flex-center {

align-items: center;

display: flex;

justify-content: center;

}

.position-ref {

position: relative;

}

.top-right {

position: absolute;

right: 10px;

top: 18px;

}

.content {

text-align: center;

}

.title {

font-size: 84px;

}

.links > a {

color: #636b6f;

padding: 0 25px;

font-size: 12px;

font-weight: 600;

letter-spacing: .1rem;

text-decoration: none;

text-transform: uppercase;

}

.m-b-md {

margin-bottom: 30px;

}

</style>

</head>

<body>

<div class="flex-center position-ref full-height">

@if (Route::has('login'))

<div class="top-right links">

@if (Auth::check())

<a href="{{ url('/home') }}">Home</a>

@else

<a href="{{ url('/login') }}">Login</a>

<a href="{{ url('/register') }}">Register</a>

@endif

</div>

@endif

<div class="content">

<div class="title m-b-md">

Данные

</div>

<div>

<table>

@foreach ($articles as $article):

<tr>

<td>{{ $article->id }}</td>

<td>{{ $article->title }}</td>

<td>{{ $article->text }}</td>

</tr>

@endforeach

</table>

</div>

</div>

</div>

</body>

</html>

Теперь надо создать роут. Роуты находятся в папке routes\. Открываем файл web.php и добавляем в него следующий код:


Route::get('/articles', ['uses' => 'ArticleController@index']);

Теперь переходя по ссылке articles будет вызван метод index контроллера ArticleController.

Давайте проверим, что у нас получилось, переходим по адресу <наш сайт>/articles, в моем случае адрес http://pagination.loc/articles

вывод статей без пагинации

Мы видим все 25 записей. Вот мы и подошли к самому важному в этой статье – пагинации в Laravel.

Пагинация в Laravel

Как видим, что выводить все записи не очень удобно (это у нас их 25, а если будут сотни). Для того, чтобы данные выводить постранично в ядре Laravel встроена пагинация. Давайте сделаем так, чтобы у нас на странице выводились по 5 элементов.

Переходим в наш контроллер ArticleControler и строку


$articles = Article::all();

Заменяем на


$articles = Article::paginate(5);

Осталось во вьюшке добавить навигацию по страницам. Для этого в нашу вьюшку добавим следующий код после таблицы с данными:


{{ $articles->links() }}

Проверим. Переходим на страницу вывода данных:

вывод статей с пагинацией

Да, некрасиво, нет стилей, но задача выполнена. У нас отображается на странице 5 элементов и работает постраничная навигация.

Кастомизация пагинации в Laravel

Мы можем задать свой шаблон для отображения постраничной навигации, для этого используем следующую структуру:


{{ $articles->links('<название шаблона>') }}

Давайте создадим в папке resources/views шаблон paginate.blade.php и поместим, пока, в него следующий  код:


test

Теперь в наш шаблон (в котором выводится список статей) добавим:


{{ $articles->links('paginate') }}

И проверим, что получилось.

отдельный шаблон для вывода пагинации в laravel

Отлично. Теперь давайте в файл paginate.blade.php поместим следующий код:


@if ($paginator->hasPages())
    
<ul class="pagination">
        @if ($paginator->onFirstPage())
            
<li class="disabled"><span>&laquo;</span></li>

        @else
            
<li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">&laquo;</a></li>

        @endif
        @foreach ($elements as $element)
            @if (is_string($element))
                
<li class="disabled"><span>{{ $element }}</span></li>

            @endif
            @if (is_array($element))
                @foreach ($element as $page => $url)
                    @if ($page == $paginator->currentPage())
                        
<li class="active"><span>{{ $page }}</span></li>

                    @else
                        
<li><a href="{{ $url }}">{{ $page }}</a></li>

                    @endif
                @endforeach
            @endif
        @endforeach
        @if ($paginator->hasMorePages())
            
<li><a href="{{ $paginator->nextPageUrl() }}" rel="next">&raquo;</a></li>

        @else
            
<li class="disabled"><span>&raquo;</span></li>

        @endif
    </ul>


@endif

И внесем изменения в стили, откроем файл index.blade.php добавим стили:


…

.pagination li{
    list-style-type: none;
    float: left;
    margin-left: 10px;
}
.pagination li span {
    color: #000;
}
.pagination li a {
    color: #000;
    text-decoration: none;
}

…

Посмотрим, что получилось:

кастомизация постраничной навигации в Laravel

Вот теперь красиво. Давайте подробнее рассмотрим код, который мы добавили в шаблон постраничной навигации.

  • $paginator->hasPages() – возвращает true если есть страницы
  • $paginator->onFirstPage() – true, если мы на первой странице
  • $paginator->previousPageUrl() – получает ссылку на предыдущую страницу, если нет, то возвращает null
  • $paginator->currentPage() – получает текущую страницу
  • $paginator->hasMorePages() – возвращает true, если есть следующие страницы
  • $paginator->nextPageUrl() – получает ссылку на следующую страницу, если нет то возвращает null

Есть множество и других методов, о которых вы можете прочитать в официальной документации по API Laravel

А по самой пагинации в Laravel можете прочитать тут.

Заключение

В этой статье мы с вами настроили пагинацию в Laravel и кастомизировали ее. Но перед этим настроили подключение к базе данных, создали и запустили миграцию, заполнили таблицу тестовыми данными с помощью seeder в Laravel, создали модель, создали контроллер, написали маршрут.

Чтобы не пропустить выхода новых статей подписываемя: VK, twitter, facebook. И канал на youtube
Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

©2012-2018 По всем вопросам обращайтесь через форму обратной связи

Яндекс.Метрика