neurony / laravel-sort
Requires
- php: ^7.2
- illuminate/contracts: ^6.0
- illuminate/database: ^6.0
- illuminate/support: ^6.0
Requires (Dev)
- orchestra/testbench: ^4.0
- phpunit/phpunit: ~7.0|^8.0
README
概览
此包允许您根据属性或通过其关系对 Eloquent 模型记录进行排序。
可以排序的关系类型: hasOne
、belongsTo
安装
通过 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
请注意 sort
和 direction
参数!
如果您使用的是 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
请注意,您只能按类型为 belongsTo
或 hasOne
的关系排序。
更改排序参数
在 步骤 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。