-
Paginare rezultate cu Eloquent
-
Afisare rezultate paginate
-
Metode ale instantei de paginare
-
Personalizare link-uri pentru paginare
Framework-ul Laravel are un sistem de paginare integrat cu
constructorul SQL si
Eloquent, ce ofera un sistem de paginare al inregistrarilor din baza de date usor de folosit.
Paginare cu Constructor SQL
Modul cel mai simplu de paginare a inregistrarilor din baza de date este prin folosirea metodei
paginate() la
Constructorul SQL sau la interogare cu
Eloquent.
Metoda
paginate() preia un argument:
numarul de elemente ce trebuie afisate pe pagina. Apoi, seteaza automat limita si offset-ul in functie de pagina curenta.
Pagina curenta cu rezultate paginate e detectata prin valoarea numarului din adresa HTTP, care e automat adaugat in link-urile de paginare.
- Exemplu de controller pentru afisare 20 elemente pe pagina:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class PagesController extends Controller{
//Shows paginated results
//@return a view
public function index(){
$pages = DB::table('table_name')->paginate(20);
return view('pages.index', ['pages'=>$pages]);
}
}
- Puteti apela paginate() dupa ce definiti si alti parametri pt. interogarea SQL, precum clauze
where() sau
DB:raw().
$pages = DB::table('table_name')->where('visits', '>', 100)->paginate(20);
$pages = DB::table('table_name')->select(DB::raw('*, DATE_FORMAT(dtreg, "%Y-%m-%d") as dtreg'))->paginate(20);
Paginare rezultate cu Eloquent
Puteti folosi metoda paginate() si cu
Eloquent. Syntaxa e asemanatoare:
$users = App\User::paginate(20);
$users = User::where('votes', '>', 100)->paginate(20);
Afisare rezultate paginate
Rezultatele returnate de metoda
paginate() pot fi parcurse ca si un array, (de exemplu cu
foreach()).
Pentru a afisa link-urile de paginare care sunt create automat, folositi metoda
$pages->links() (aici,
$pages reprezinta obiectul returnat de metoda
paginate()).
Puteti afisa rezultatele si link-urile paginarii in
Blade template:
<div class="container">
@foreach($pages as $page)
{{ $page->id }} - {{ $page->title }}
@endforeach
</div>
{{ $pages->links() }}
- Metoda
$pages->links() returneaza o lista <ul> cu link-urile de paginare, compatibil cu
framework-ul Bootstrap.
Metoda simplePaginate()
Daca vreti sa afisati doar link-uri "
Next" si "
Previous" in view (fara link-uri pt. fiecare numar de pagina), puteti folosi metoda
simplePaginate(), care efectueaza o interogare mai rapida.
//with query builder
$users = DB::table('users')->simplePaginate(20);
//or
$users = DB::table('users')->where('votes', '>', 100)->simplePaginate(20);
//with Eloquent
$users = User::simplePaginate(20);
//or
$users = User::where('votes', '>', 100)->simplePaginate(20);
Personalizare adresa URI de paginare
Daca vreti ca paginatorul sa creeze link-uri de forma:
//example.com/custom/url?page=N, folositi metoda
withPath(), cu un sir "
custom/url" ca argument.
Route::get('pages', function(){
$pages = DB::table('table_name')->paginate(20);
$pages->withPath('custom/url');
//
});
- Apoi folositi
{{ $pages->links() }} in template.
Ca sa
adaugati siruri la fiecare link de paginare, aplicati metoda
appends().
- De exemplu, pt. a adauga sirul "
sort=votes" in fiecare link al paginarii, se poate folosi urmatorul cod:
{{ $pages->appends(['sort' => 'votes'])->links() }}
Daca doriti sa adaugati un "
fragment hash", se foloseste metoda
fragment().
- De exemplu, adaugam '
#bip' la sfarsitul fiecarui link de paginare:
{{ $pages->fragment('bip')->links() }}
Metode ale instantei de paginare
Fiecare obiect paginator (returnat de metoda
paginate()) contine metode pentru informatii despre paginare:
- count() - returneaza numarul de elemente in setul de rezultate curent.
- currentPage() - returneaza indexul numeric al paginii curente.
- firstItem() - indexul numeric al primului element din pagina curenta.
- hasMorePages() - True daca exista o pagina urmatoare, altfel False.
- lastItem() - indexul numeric al ultimului element din pagina curenta.
- lastPage() - returneaza indexul numeric al ultimei pagini (nu e valabil cu simplePaginate()).
- nextPageUrl() - adresa URL a paginii urmatoare. NULL daca nu e o pagina urmatoare.
- perPage() - numarul de elemente pe pagina.
- previousPageUrl() - adresa URL a paginii anterioare. NULL daca nu e o pagina anterioara.
- total() - numarul total de elemente (nu e valabil cu simplePaginate()).
- url($nr) - adresa URL a paginii cu indexul numeric $nr.
Returnare rezultate paginate ca JSON
Pentru a returna rezultatele date de metoda
paginate() in format JSON, puteti folosi metoda
toJson():
public function index(){
$pages = DB::table('table_name')->paginate(15);
return $pages->toJson();
}
Sirul JSON de la paginator va contine informatii precum:
total, pagina_curenta, ultima_pagina, si altele.
Array-ul cu elementele paginate e in proprietatea "
data" in obiectul JSON.
- Codul de mai sus va returna un JSON ca acesta:
{
"total": 50,
"per_page": 15,
"current_page": 1,
"last_page": 4,
"next_page_url": "https://coursesweb.net?page=2",
"prev_page_url": null,
"from": 1,
"to": 15,
"data":[
{
// Result Object of first item
},
{
// Result Object of second item
}
]
}
Personalizare link-uri pentru paginare
Codul HTML returnat cu link-urile de paginare e compatibil cu
framework-ul Bootstrap.
Ca sa creati propriul cod HTML pentru aceste link-uri, faceti un fisier view:
resources/views/pagination/default.blade.php cu codul de paginare personalizat, si adaugati numele fisierului view ('
pagination.default') ca argument la metoda
links().
- De exemplu, acesta este template-ul implicit pentru paginare in Laravel:
@if($paginator->hasPages())
<ul class="pagination">
{{-- Previous Page Link --}}
@if($paginator->onFirstPage())
<li class="disabled"><span>«</span></li>
@else
<li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li>
@endif
{{-- Pagination Elements --}}
@foreach($elements as $element)
{{-- "Three Dots" Separator --}}
@if(is_string($element))
<li class="disabled"><span>{{ $element }}</span></li>
@endif
{{-- Array Of Links --}}
@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
{{-- Next Page Link --}}
@if($paginator->hasMorePages())
<li><a href="{{ $paginator->nextPageUrl() }}" rel="next">»</a></li>
@else
<li class="disabled"><span>»</span></li>
@endif
</ul>
@endif
- Creati un fisier php:
resources/views/pagination/default.blade.php, si copiati codul de mai sus in acel fisier. Modifiati apoi continutul din "
pagination/default.blade.php" dupa cum doriti.
- Apoi, afisati link-uri de paginare in template folosind acest cod:
{{$results->links('pagination.default')}}
De asemenea, puteti sa transmiteti date aditionale la view-ul de paginare:
{{$results->links('pagination.default', ['name'=>$value])}}
Un alt mod de a personaliza view-ul de paginare e prin exportare in directorul
resources/views/vendor/ folosind comanda
artisan vendor:publish in Command-Line-Interface:
php artisan vendor:publish --tag=laravel-pagination
Aceasta instructiune va plasa view-ul in directorul "
resources/views/vendor/pagination/". Apoi, editati fisierul "
default.blade.php" ca sa modificati codul HTML de paginare.
- Fisierul "
simple-default.blade.php" e pentru link-urile de paginare returnate de metoda
simplePaginate().
- Documentatie:
Laravel - Database: Pagination