Skip to content

Blog Công Nghệ

MENUMENU
  • Trang chủ
  • Giới Thiệu
  • Lập Trình
    • Lập Trình Website
      • Laravel
        • Phân Tích Dự Án
      • PHP
      • SQL
      • HTML
      • CSS
      • Javascipt
      • My Project
      • Wordpress
    • Luyện Skill
    • Lập trình winform
    • CSDL
    • Lập Trình Android
    • Trí tuệ nhân tạo
    • Khai Khoáng Dữ Liệu
    • Arduino
    • Khác
    • Đồ án
  • Phần Mềm
    • Powerpoint
    • Tool
  • Cuộc sống và Giải trí
    • Hợp âm
    • web5ngay - youtube
    • Công Giáo
    • Kỹ Năng Sống
    • Street Workout
  • Danh sách bài viết
  • Guide line
    • Guild line phỏng vấn
    • Guide lines Laravel
    • Guide line Module Frontend
  • Tóm tắt sách
  • Fanpage

Blog Công Nghệ

Nơi chia sẻ kiến thức

Paginate trong Laravel sử dụng như thế nào

2 Tháng Năm, 2020 by admin
Lượt xem: 298

Contents

  • 1. Giới thiệu
  • 2. Sử dụng cơ bản
  • 3. Tùy chỉnh giao diện phân trang trong Laravel 5
    • 3.1 Nhìn lại cách Laravel phân trang cho bạn
    • 3.2 Giải quyết như thế này
  • Kết luận

1. Giới thiệu

Trong các framework khác, pagination có thể khá là đau đầu, còn Laravel thì làm cho nó trở nên đơn giản hơn rất nhiều nó kết hợp với `query builder` và `eloquent ORM` và cung cấp phân trang của dữ liệu trong database một cách thuận tiện. Laravel có thể nhanh chóng tạo một khoảng thông minh của các links dựa trên trang hiện tại và mã HTML sinh ra thì tương thích với `Bootstrap CSS framework`.

2. Sử dụng cơ bản

  • Phân trang kết quả từ Query Builder Có vài cách để phân trang. Đơn giản nhất là sử dụng hàm paginate ở trong query builder hoặc trong Eloquent query. Hàm paginate cung cấp bởi Laravel sẽ tự động xử lý việc tạo ra limit và vị trí trang dựa trên trang hiện tại đang được xem bởi người dùng. Mặc định, trang hiện tại được nhận biết thông qua giá trị ?page trên query string trên HTTP request. Dĩ nhiên là giá trị này được tự động nhận biết bởi Laravel, và cũng được tự động thêm vào các link sinh ra bởi paginator.

Trước tiên, hãy cùng nhau xem việc gọi hàm paginate trên một query. Trong ví dụ này, đối số duy nhất tryền vào hàm paginate là số items bạn muốn hiển thị trên từng page. Ở đây, chúng ta ví dụ đặt chỉ số là 15 item trên một page:

<?php

namespace App\Http\Controllers;

use DB;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Show all of the users for the application.
     *
     * @return Response
     */
    public function index()
    {
        $users = DB::table('users')->paginate(15);

        return view('user.index', ['users' => $users]);
    }
}

Chú ý: Hiện tại, việc phân trang sử dụng groupBy chưa thể thực thi hiệu quả bởi Laravel. Nếu bạn cần sử dụng groupBy với một tập kết quả phân trang, thì khuyến khích các bạn thực hiện query database và tạo một paginator thủ công.

  • Phân trang đơn giản

Nếu bạn chỉ cần hiển thị hai link đơn giản “Next” và “Previous” trên pagination view, bạn có thể sử dụng hàm simplePaginate để thực hiện một query hiệu quả hơn. Cách này rất hữu dụng với một tập dữ liệu lớn nếu bạn không cần hiển thị một link cho mỗi số trang khi thực hiện render:

$users = DB::table('users')->simplePaginate(15);
  • Phân trang kết quả từ Eloquent

Bạn cũng có thể phân trang kết quả từ Eloquent. Trong ví dụ này, chúng ta sẽ phân trang User model với 15 item một trang. Như bạn thấy, cú pháp gần như giống hệt với phân trang kết quả từ query builder:

$users = App\User::paginate(15);

Bạn cũng có thể gọi paginate sau khi thiết lập rằng buộc trên query, ví dụ như mệnh đề where:

$users = User::where('votes', '>', 100)->paginate(15);

Bạn cũng có thể sử dụng simplePaginate khi phân trang với Eloquent:

$users = User::where('votes', '>', 100)->simplePaginate(15);
  • Tạo thủ công một Paginator

Đôi khi bạn muốn tạo một đối tượng xử lý phân trang riêng, truyền vào cho nó một mảng các items. Bạn có thể thực hiện bằng cách tạo một đối tượng từ Illuminate\Pagination\Paginator hoặc từ Illuminate\Pagination\LengthAwarePaginator, phục thuộc vào yêu cầu của bạn.

Class Paginator không quan tâm tổng số items trên tập kết quả; tuy nhiên, chính vì thế mà class không có phương thức để lấy được index của trang cuối cùng. Class LengthAwarePaginator nhận đối số tương tự với Paginator, nhưng lại cần biết tổng số items có trong tập kết quả.

Nói một cách khác, Paginator tương ứng với hàm simplePaginate trên query builder và Eloquent, trong khi LengthAwarePaginator lại tương ứng với hàm paginate.

Khi tự tạo một đối tượng paginator thủ công, bạn nên tự “cắt” mảng của tập kết quả truyền vào cho paginator. Nếu bạn không chắc làm như thế nào, hãy tham khảo hàm array_slice của PHP.

  • Hiển thị kết quả lên views

Khi bạn gọi hàm paginate hay simplePaginate trên query builder hay Eloquent, bạn sẽ nhận được một đối tượng paginator. Khi gọi hàm paginate, bạn sẽ nhận được một đối tượng của Illuminate\Pagination\LengthAwarePaginator. Khi gọi hàm simplePaginate, bạn sẽ nhận được một đối tượng của Illuminate\Pagination\Paginator. Những đối tượng này cung cấp vài phương thức mô tả tập kết quả. Ngoài những phương thức này, các đối tượng paginator đều là các iterators và có thể được lặp như một mảng.

Khi đã nhận được kết quả, bạn có thể thực hiện hiển thị kết quả và render các link vào page sử dụng Blade:

<div class="container">
    @foreach ($users as $user)
        {{ $user->name }}
    @endforeach
</div>

{!! $users->links() !!}

//Lưu ý: sử dụng bootstrap 3 thì nó mới hiển thị theo bootstrap nhé.

Hàm links sẽ render các link cho tới hết các trang trong tập kết quả. Mỗi link này đều chứa sẵn một tham số ?page với giá trị đúng. Hãy nhớ là, mã HTML sinh ra bởi hàm links tương thích với Bootstrap CSS framework.

  • Tuỳ chọn The Paginator URI Hàm setPath cho phép bạn tuỳ chọn URI sử dụng bởi paginator khi sinh ra links. Ví dụ, nếu bạn muốn paginator sinh ra links theo kiểu này http://example.com/custom/url?page=N, bạn chỉ cần truyền vào custom/url vào hàm setPath:
Route::get('users', function () {
    $users = App\User::paginate(15);

    $users->setPath('custom/url');
    //
});
  • Thêm vào link phân trang

Bạn có thể thêm vào query string của link phân trang sử dụng hàm appends. Ví dụ, để thêm vào &sort=votes vào mỗi link, bạn nên thực hiện thế này:

{!! $users->fragment('foo')->links() !!}

-** Các phương thức helper bổ sung**

Bạn có thể truy cập các thông tin khác trong phân trang thông qua các phương thức sau trong paginator:

$results->count()
$results->currentPage()
$results->firstItem()
$results->hasMorePages()
$results->lastItem()
$results->lastPage() (Not available when using simplePaginate)
$results->nextPageUrl()
$results->perPage()
$results->previousPageUrl()
$results->total() (Not available when using simplePaginate)
$results->url($page)
  • Chuyển kết quả sang JSON

Các lớp kết quả phân trang của Laravel triển khai từ contract Illuminate\Contracts\Support\JsonableInterface và mở ra hàm toJson, do đó, rất dễ dàng để có thể chuyển kết quả thành JSON.

Bạn cũng có thể convert một đối tượng paginator sang JSON bằng cách return nó từ một route hay controller action:

Route::get('users', function () {
    return App\User::paginate();
});

JSON tạo ra từ paginator sẽ chứa các thông tin meta như total, current_page, last_page, và nhiều nữa. Các đối tượng kết quả đều có trong khoá data của mảng JSON. Đây là một ví dụ về JSON tạo bởi paginator từ một route:

{
   "total": 50,
   "per_page": 15,
   "current_page": 1,
   "last_page": 4,
   "next_page_url": "http://laravel.app?page=2",
   "prev_page_url": null,
   "from": 1,
   "to": 15,
   "data":[
        {
            // Result Object
        },
        {
            // Result Object
        }
   ]
}

Nguồn: https://viblo.asia/p/tim-hieu-ve-pagination-trong-laravel-3P0lPMrn5ox

3. Tùy chỉnh giao diện phân trang trong Laravel 5

Phân trang là một kỹ thuật, một thành phần không thể thiếu trong một website. Dù thực hiện đơn giản nhưng bạn phải mất khá nhiều thời gian cho việc này. Nếu đã và đang sử dụng Laravel, chắc việc phân trang không còn là vấn đề với bạn nữa. Mọi thứ đã được đơn giản hóa với vài thao tác bằng các phương thức được Laravel cung cấp.

3.1 Nhìn lại cách Laravel phân trang cho bạn

Bạn đã quên? Xem lại Laravel Pagination Docs

Điểm lại một tý, có 2 công việc bạn cần phải thực hiện: Một là lấy dữ liệu theo trang và hai là hiển thị phân trang trên blade view.

  • Việc thứ nhất, bạn chỉ cần sử dụng phương thức paginate(numberPerPage) hoặc simplePaginate(numberPerPage) tại nơi muốn lấy dữ liệu. (Thay cho các phương thức như get(), all(),…)
  • Việc cuối cùng, sử dụng phương thức links() như thế này {{ $items->links() }} (items là danh sách dữ liệu đã lấy được ở trễn) bên blade view để hiển thị giao diện phân trang nơi bạn muốn.

Theo như Laravel tuyên bố thì mặc định giao diện phân trang được tự động sinh ra tương thích với Bootstrap CSS framework. Nhưng nếu bạn không sử dụng Bootstrap hoặc muốn thay đổi giao diện phân trang hiện có thì phải làm sao

3.2 Giải quyết như thế này

Tại đây cũng có nói: Customizing The Pagination View

Bạn có thể sử dụng phương thức links() và truyền vào đó một đối số như thế này:

{{ $paginator->links('view.name') }}

// Ném dữ liệu sang view...
{{ $paginator->links('view.name', ['foo' => 'bar']) }}

view.name? blade name lấy đâu ra.

?

Chắc chắn là phải tự viết rồi  Muốn đơn giản thì thực hiện bước bên dưới để export các file pagination view mặc định của laravel rồi chôm chỉa về cho mình thôi.

Hoặc đơn giản hơn, sử dụng command: php artisan vendor:publish –tag=laravel-pagination để laravel tự động copy các file blade phân trang, bạn chỉ cần sửa trực tiếp lên những file đó tại thư mục resources/views/vendor/pagination

Đó là những cách Laravel giới thiệu cho bạn, ngoài ra còn nhiều cách khác. Mình thì hay sử dụng render(‘custom_view’) thay cho link(‘custom.view’):

{{ $paginator->render('view.name') }}

Còn name.blade đã custom thì…:

@if ($paginator->hasPages())
    <!-- Pagination -->
    <div class="pull-right pagination">
        <ul class="pagination">
            {{-- Previous Page Link --}}
            @if ($paginator->onFirstPage())
                <li class="disabled">
                    <span><i class="fa fa-angle-double-left"></i></span>
                </li>
            @else
                <li>
                    <a href="{{ $paginator->previousPageUrl() }}">
                        <span><i class="fa fa-angle-double-left"></i></span>
                    </a>
                </li>
            @endif

            {{-- Pagination Elements --}}
            @foreach ($elements as $element)
                {{-- Array Of Links --}}
                @if (is_array($element))
                    @foreach ($element as $page => $url)
                        @if ($page == $paginator->currentPage())
                            <li class="active"><span>{{ $page }}</span></li>
                        @elseif (($page == $paginator->currentPage() + 1 || $page == $paginator->currentPage() + 2) || $page == $paginator->lastPage())
                            <li><a href="{{ $url }}">{{ $page }}</a></li>
                        @elseif ($page == $paginator->lastPage() - 1)
                            <li class="disabled"><span><i class="fa fa-ellipsis-h"></i></span></li>
                        @endif
                    @endforeach
                @endif
            @endforeach

            {{-- Next Page Link --}}
            @if ($paginator->hasMorePages())
                <li>
                    <a href="{{ $paginator->nextPageUrl() }}">
                        <span><i class="fa fa-angle-double-right"></i></span>
                    </a>
                </li>
            @else
                <li class="disabled">
                    <span><i class="fa fa-angle-double-right"></i></span>
                </li>
            @endif
        </ul>
    </div>
    <!-- Pagination -->
@endif

Kết quả sẽ như thế này

Thay vì mặc định của Laravel

Nguồn: https://viblo.asia/p/tuy-chinh-giao-dien-phan-trang-trong-laravel

Kết luận

Trên đây mình đã hướng dẫn các bạn paginate trong Laravel. Cảm ơn các bạn đã xem bài viết của mình. Bài viết sau mình sẽ hướng dẫn các bạn về migration trong laravel.

Related posts:

  1. API sử dụng resource trong Laravel
  2. Migrations trong Laravel
  3. Queue trong Laravel
  4. Bước đầu sử dụng Laravel

Post navigation

Previous Post:

Dự án thứ hai – Tomate

Next Post:

Các đề tài đồ án tổng hợp

Trả lời Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Ẩn sidebar

Tìm kiếm

Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages

Blog Công Nghệ

Bài viết mới

  • Master typescript
  • Sendmail trong Laravel sử dụng dịch vụ SES, SQS của Amazon
  • Install SSL in Nginx Ubuntu
  • Docker study
  • Bảo vệ: Hướng dẫn code bot Telegram easy game

Lượng truy cập

0074458
Visit Today : 54
Visit Yesterday : 178
This Month : 729
Who's Online : 7
© 2025 Blog Công Nghệ | WordPress Theme by Superbthemes