akaunting/laravel-sortable

Laravel 的可排序行为包

2.0.2 2024-07-12 11:55 UTC

This package is auto-updated.

Last update: 2024-09-12 12:18:38 UTC


README

Downloads Tests StyleCI License

此包允许您为 modelsviews 添加可排序行为。它包含一个特质,您可以在其中设置可排序字段,以及一个 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']" />

排序关系

此包支持 HasOneBelongsTo 关系排序

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)。有关更多信息,请参阅许可证