Laravel 列排序以及分頁範例
Laravel 列排序以及分頁範例
效果
安裝 kyslik/column-sortable
此包可用於 Laravel 5/6/7/8
composer
composer require kyslik/column-sortable
手動安裝(laravel 5.5 之前版本)
在config/app.php
添加服務提供者
'providers' => [ |
發佈配置
php artisan vendor:publish --provider="Kyslik\ColumnSortable\ColumnSortableServiceProvider" --tag="config"
用法
In Model
在你想使用排序的model
使用Sortable
,將要使用排序欄位定義在$sortable
陣列當中
|
提醒: Sortable trait
為模型添加了 Sortable
範圍,因此您可以將其與分頁一起使用。
在 樣板 Blade
中
在 Blade
中使用@sortablelink()
@sortablelink('column', 'Title', ['parameter' => 'smile'], ['rel' => 'nofollow']) |
- 第一個參數: 要排序的欄位名稱
- 第二個參數: 在前端要顯示的名稱
- 第三個參數: Http GET 默認查詢字符串參數
?parameter=smile
- 第四個參數: 可以在第 4 個參數中使用自定義 URL 作為 ‘href’ 屬性,查詢字符串將附加到它。此範例會將
rel="nofollow"
附加在a tag
上
可以省略第二,第三,第四個參數
官方提供可能使用範例與情境
@sortablelink('name') |
可以設置應用於標題(第二個參數)的默認格式功能,默認情況下設置為ucfirst
。
簡單的配置
config > columnsortable.php
表格中有為可排序連結區分類型(數字、數量和 alpha
),並為每種類型應用不同的類,可以自行新增或修改對應的icon
'columns' => [ |
Font Awesome(預設的字體類)
Font Awesome 5
更改正序倒序的 icon
,將配置文件中的後綴類分別從 -asc/-desc (FA 4)
更改為 -up/-down (FA 5)
。
/* this is FA 5 compatible. |
如未發布配置文件請參考發佈配置
完整範例
Routes
Route::get('/products', 'App\Http\Controllers\ProductController@index');
Controller
public function index() |
View(包括分頁)
@sortablelink('id', '產品ID') |
注意:Blade 識別指令的能力取決於指令本身之前的空格 \
HasOne / BelongsTo 關聯排序
定義 hasOne 關聯
要使用關聯排序,需要先在 model 定義hasOne()
關聯
/** |
定義 BelongsTo 關聯
如果有自引用模型(如評論、類別等);父表將使用 parent_ 字符串作為別名,有關更多信息,請參閱issue #60。
/** |
定義$sortable
陣列
在兩個模型中定義 $sortable 數組(否則,package 使用 Scheme::hasColumn() 這是一個額外的數據庫查詢)
User Model
public $sortable = ['id', 'name', 'email', 'created_at', 'updated_at'];
UserDetail Model
public $sortable = ['address', 'phone_number'];
Blade 的關聯排序
@sortablelink('detail.phone_number', 'phone') |
這裡使用的是在模型中定義的關係“名稱”(方法)而不是使用表名稱。
不要同時使用兩個不同關係的組合,你會得到關係未定義的錯誤
預設使用.
做為關聯預設符號,如果.
不是你想要的可以到配置文件中修改
'uri_relation_column_separator' => '.' |
ColumnSortable overriding (advanced)
可以覆蓋 ColumnSortable 關係功能,基本上您可以編寫自己的連接/查詢並手動應用 orderBy()
範例:
class User extends Model |
controller 中一樣使用$users = $user->sortable()->paginate(10);
在 view 中@sortablelink('address')
捕捉異常 try catch
ColumnSortableException
使用三個代碼(0、1、2)拋出自定義異常 。
代碼 0 表示explode()
無法將 URI 參數“排序”分解為兩個值。例如:sort=detail..phone_number
- 生成大小為 3 的數組,這會導致 package 拋出代碼為 0 的異常。
代碼 1 表示 $query->getRelation()
方法失敗,這意味著關聯名稱無效(不存在,未在模型中聲明)。
代碼 2 表示通過排序參數提供的關係不是 hasOne 的實例。
捕捉異常範例:
try { |