Laravel 分頁(Pagination)功能應用

碼農思考中 / Ted
7 min readJul 25, 2023

分頁 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 方法。



5分鐘

2021-01-05 23:08:00

Laravel 分頁(Pagination)功能應用


分頁 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') }}

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

Originally published at https://studio-44s.tw.

--

--

碼農思考中 / Ted

全端工程師,Asp.Net MVC、PHP Laravel、ReactJS,隨手記錄各種技術、心得與設計靈感。未來規劃除程式技能外,也想往 UI/UX 設計領域發展。目前文章從舊有網站「筆記長也」搬移過來。業餘接案中:https://studio-44s.tw/