neurony/laravel-sort

此包已被放弃,不再维护。作者建议使用 varbox/varbox 包。

通过属性或关系对 Eloquent 模型记录进行排序

3.0.0 2019-11-19 09:40 UTC

This package is auto-updated.

Last update: 2020-10-10 14:15:44 UTC


README

Build Status StyleCI Scrutinizer Code Quality

概览

此包允许您根据属性或通过其关系对 Eloquent 模型记录进行排序。

可以排序的关系类型: hasOnebelongsTo

安装

通过 Composer 安装包

composer require neurony/laravel-sort

用法

步骤 1

您的 Eloquent 模型应使用 Neurony\Sort\Traits\IsSortable 特性。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Neurony\Sort\Traits\IsSortable;

class YourModel extends Model
{
    use IsSortable;
    
    ...
}

步骤 2

您可以通过任何方式访问所需的 URI,以指定排序的行为。

/search-something?sort=name&direction=asc

请注意 sortdirection 参数!

如果您使用的是 IsSortable 特性,这两个参数非常重要,因为这两个参数是默认用于定义排序字段(sort 参数)和排序方向(direction 参数)。

  • 排序字段(sort 参数)
  • 排序方向(direction 参数)

要了解如何更改这些参数,请参阅 额外 部分。

步骤 3

一旦您在 Eloquent 模型中使用了 Neurony\Sort\Traits\IsSortable 特性,并且提供了正确的排序参数,您就可以使用特性上存在的 sorted() 查询作用域来对模型记录进行排序。

<?php

namespace App\Http\Controllers;

use App\YourModel;
use Illuminate\Http\Request;

class YourController extends Controller
{
    public function index(Request $request)
    {
        $records = YourModel::sorted($request->all())->get();
    }
}

sorted 查询作用域接收一个必需的第一个参数,它应该是一个关联数组,包含排序字段和排序方向。

// in our case, what's passed inside that parameter is this array:
['sort' => 'name', 'direction' => 'asc']

额外

根据关系排序

要按关系排序 Eloquent 模型记录,请在指定 sort 参数时使用以下格式
{relationship_name}.{relationship_attribute}

// sort posts by their author name in ascending order

/search-posts?sort=author.name&direction=asc

请注意,您只能按类型为 belongsTohasOne 的关系排序。

更改排序参数

步骤 2 中,我们讨论了指定参数的重要性,这些参数告诉特性要排序的字段和方向。

如果您愿意,这些字段可以更改为其他字段。

为了做到这一点,您必须创建一个将扩展此包附带 abstract Sort 对象的 Sort 对象。

<?php

namespace App\Sorts;

use Neurony\Sort\Objects\Sort;

class YourSort extends Sort
{
    /**
     * Get the request field name to sort by.
     *
     * @return string
     */
    public function field()
    {
        return 'field-to-sort-by';
    }

    /**
     * Get the direction to sort by.
     *
     * @return string
     */
    public function direction()
    {
        return 'direction-to-sort-in';
    }
}

创建排序对象后,将其作为第二个参数传递给排序模型记录时的 sorted 查询作用域。

<?php

namespace App\Http\Controllers;

use App\YourModel;
use App\Sorts\YourSort;
use Illuminate\Http\Request;

class YourController extends Controller
{
    public function index(Request $request, YourSort $sort)
    {
        $records = YourModel::sorted($request->all(), $sort)->get();
    }
}

对于上面的例子,您的URI应该如下所示

/search-something?field-to-sort-by=name&direction-to-sort-in=asc

// or to sort by a relationship

/search-something?field-to-sort-by=someRelation.some_attribute&direction-to-sort-in=asc

致谢

安全

如果您发现任何安全相关的问题,请发送电子邮件至 andrei.badea@neurony.ro,而不是使用问题跟踪器。

许可证

MIT许可证(MIT)。更多信息请参阅 LICENSE

变更日志

有关最近变更的更多信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTING