Laravel 分頁(Pagination)功能應用 - 筆記長也NotesHazuya

Laravel 分頁(Pagination)功能應用

2021-01-05 23:08:00   Laravel

分頁 Pagination

在設計頁面的時候,像是文章列表這種呈現數量很多的時候就必須進行分頁。過往在實作分頁的時候其實很複雜,但是在 Laravel 當中已經有幫忙寫好的  Pagination 可以直接拿來用。

基本設定

在 Controller 或其他地方進行資料庫查詢的時候,要針對查詢結果加上 paginate()

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use DB;

class PostController extends Controller
{

    public function index()
    {
        $posts = DB::table('posts')->paginate(15);

        return view('post', ['posts' => $posts]);
    }
}

如果和我一樣使用原生語句查詢,只能改用 DB::raw 來撈回資料實體,如果使用 DB::select 資料會被序列化成為陣列。另外,由於 DB::raw 不會被 laravel 進行任何處理,所以也無法透過繫結方式帶入參數,只能自己串接,如果自己串接參數,要記得自行過濾,因為 DB::raw 下 laravel 不會幫忙過濾參數,要注意不要讓這裡變成程式的攻擊注入點。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use DB;

class PostController extends Controller
{

    public function index(){

        DB::connection('mysql');
        $posts = DB::table(DB::raw("(SELECT * FROM posts) as Post"))->paginate(15);
        return view('post', ['posts' => $posts]);

    }
}

簡單版本

如果只需要上一頁跟下一頁,可以把 paginate 替換成  simplePaginate(15)。

輸出分頁

找到要輸出的模板之後,放入下面一段程式碼

{{ $posts->links() }}

這樣就可以看到有分頁功能了

客製化

分頁預設依賴於 bootstrap 框架,如果沒有使用 bootstrap 而改用其他框架就必須客製化,先在專案下輸入指令:

php artisan vendor:publish --tag=laravel-pagination

執行完成後會發現 views/vendor/pagination 下面多了很多模板

bootstrap-4.blade.php 是預設使用的,如果要修改可以直接改這一支檔案。

改用其他檔案做為預設模板

如果要改用其他的模板,可以到 app/Providers/AppServiceProvider.php 這支檔案下引入 Paginator,然後在 root() 加入 defaultView 方法。

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Paginator::defaultView('vendor.pagination.semantic-ui');
    }
}

如果不想修改到系統檔案,也可以在使用分頁的樣版上為 links 方法帶入參數

{{ $posts->links('vendor.pagination.default') }}

這樣就可以替不同頁面使用不同的分頁樣板了。


長也

糾結當中的資管系學生,常碰PHP,喜歡進行網頁相關的設計,閒暇之餘就記錄一些筆記,紀錄自己的學習軌跡。