akaunting / laravel-sortable
Laravel 的可排序行为包
Requires
- php: ^8.0
- laravel/framework: ^9.0|^10.0
Requires (Dev)
- orchestra/testbench: ^7.4|^8.0
- phpunit/phpunit: ^9.5|^10.0
README
此包允许您为 models
和 views
添加可排序行为。它包含一个特质,您可以在其中设置可排序字段,以及一个 blade 指令来自动生成表格标题。
入门指南
1. 安装
运行以下命令
composer require akaunting/laravel-sortable
2. 发布
发布配置
php artisan vendor:publish --tag=sortable
3. 配置
您可以从 config/sortable.php
文件更改应用程序的列排序设置
用法
您只需在模型内部使用 Sortable
特质并定义 $sortable
字段。
use Akaunting\Sortable\Traits\Sortable; use Illuminate\Database\Eloquent\Model; class Post extends Model { use Sortable; ... public $sortable = [ 'id', 'title', 'author', 'created_at', ]; ... }
如果您没有定义 $sortable
数组,将使用 Scheme::hasColumn()
函数,这将执行额外的数据库查询。
范围
特质为模型添加了一个 sortable
范围,您可以在调用 paginate
之前使用它
public function index() { $posts = Post::query()->sortable()->paginate(10); return view('posts.index')->with(['posts' => $posts]); }
您还可以设置默认排序字段,当 URL 为空时将应用此字段。
$posts = $post->sortable(['author'])->paginate(10); // $post->orderBy('posts.author', 'asc') $posts = $post->sortable(['title'])->paginate(10); // $post->orderBy('posts.title', 'asc') $posts = $post->sortable(['title' => 'desc'])->paginate(10); // $post->orderBy('posts.title', 'desc')
Blade 指令
还有一个 blade
指令,您可以在视图中创建可排序链接
@sortablelink('title', trans('general.title'), ['parameter' => 'smile'], ['rel' => 'nofollow'])
第一个参数是数据库中的列。第二个参数是在锚标签内显示的。第三个参数是一个 array()
,它设置默认(GET)查询字符串。第四个参数也是一个 array()
,用于设置额外的锚标签属性。您可以在第四个参数中指定自定义 URL 作为 'href' 属性,这将附加查询字符串。
只需要第一个参数。
示例
@sortablelink('title') @sortablelink('title', trans('general.title')) @sortablelink('title', trans('general.title'), ['filter' => 'active, visible']) @sortablelink('title', trans('general.title'), ['filter' => 'active, visible'], ['class' => 'btn btn-success', 'rel' => 'nofollow', 'href' => route('posts.index')])
图标集
您可以使用任何图标集。只需根据需要更改配置文件中的 icons.wrapper
。默认情况下,它使用 Font Awesome。
Blade 组件
与指令相同,还有一个 blade
组件,您可以在视图中创建可排序链接
<x-sortablelink column="title" title="{{ trans('general.title') }}" :query="['parameter' => 'smile']" :arguments="['rel' => 'nofollow']" />
排序关系
此包支持 HasOne
和 BelongsTo
关系排序
class Post extends Model { use Sortable; ... protected $fillable = [ 'title', 'author_id', 'body', ]; public $sortable = [ 'id', 'title', 'author', 'created_at', 'updated_at', ]; /** * Get the author associated with the post. */ public function author() { return $this->hasOne(\App\Models\Author::class); } ... }
您还可以在视图中使用这些关系
// resources/views/posts/index.blade.php @sortablelink('title', trans('general.title')) @sortablelink('author.name', trans('general.author'))
注意:在存在自引用模型(如评论、分类等)的情况下;父表将以
parent_
字符串作为别名。
高级关系
您还可以通过创建以 Sortable
后缀命名的函数来扩展关系排序功能。在那里您可以自由编写自己的查询并手动应用 orderBy()
class User extends Model { use Sortable; ... public $sortable = [ 'name', 'address', ]; public function addressSortable($query, $direction) { return $query->join('user_details', 'users.id', '=', 'user_details.user_id') ->orderBy('address', $direction) ->select('users.*'); } ...
控制器和视图中的用法保持不变。
别名
您可以在模型中声明 $sortableAs
数组并使用它来别名(绕过列存在检查),并忽略表前缀
public $sortableAs = [ 'nick_name', ];
在控制器中
$users = $user->select(['name as nick_name'])->sortable(['nick_name'])->paginate(10);
在视图中
@sortablelink('nick_name', 'nick')
当您想要使用 withCount()
排序结果时非常有用。
变更日志
有关最近更改的更多信息,请参阅 发行版
贡献
欢迎拉取请求。您必须遵循 PSR 编码标准。
安全性
请查阅 我们的安全策略 了解如何报告安全漏洞。
鸣谢
许可
麻省理工学院许可证(MIT)。有关更多信息,请参阅许可证。