kemodev/laravel-restful-filter

在RESTful API上过滤查询的简单方法

v1.0.1 2021-07-18 03:07 UTC

This package is auto-updated.

Last update: 2024-09-18 10:23:14 UTC


README

在RESTful API上过滤查询的简单方法

兼容性

限制

  • 目前仅在SQL类型数据库上工作(已在MySQL、PostgreSQL、SQL Server上测试过)
  • 可能SQL查询未优化(已经检查过,但我想没有,结果很快。最后,这是你的选择)
  • 通过关系排序不可用
  • 过滤器 BetweenIn 不可用
  • 无法添加自定义逻辑

可用搜索运算符

  • 小于
  • 小于等于
  • 大于
  • 大于等于
  • 等于
  • LIKE

安装

使用composer安装

composer install kemodev/laravel-restful-filter

在模型上使用包

<?php

namespace App;

use Kemodev\RestfulFilter\Filterable;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use Filterable;

    //rest of your code on model
}

开始使用

首先,您需要定义您的API能够过滤哪些字段

1. 过滤

有三种可用的过滤方法

  • 基本
<?php

namespace App;

use Kemodev\RestfulFilter\Filterable;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use Filterable;

    protected $filterableColumns = [
        'email' => 'email'
    ];
    //rest of your code on model
}
  • 关系
<?php

namespace App;

use Kemodev\RestfulFilter\Filterable;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
   use Filterable;

   protected $filterableColumns = [
       'email' => 'email',
       'role_name' => 'role.name'
   ];

   public function role()
   {
       return $this->belongsTo(Role::class);
   }
   //rest of your code on model
}
  • 所有类型
<?php

namespace App;

use Kemodev\RestfulFilter\Filterable;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
   use Filterable;

   protected $filterableColumns = [
       'email' => 'email',
       'search' => 'first_name,last_name,role.name'
   ];

   public function role()
   {
       return $this->belongsTo(Role::class);
   }
   //rest of your code on model
}

此方法通常用于使用单个字段过滤,例如在默认的datatables

2. 排序

<?php

namespace App;

use Kemodev\RestfulFilter\Filterable;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use Filterable;

    protected $sortableColumns = [
        'email' => 'email'
    ];

    //rest of your code on model
}

如果您注意到,变量是关联数组,键表示URL上的查询参数,值是列名。

3. 使用

最基本的,您可以使用如下方式

<?php

namespace App\Http\Controllers;

use App\Users;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function getAll(Request $request)
    {
        $filter = $request->except('sort');
        $sort = $request->get('sort');

        $data = User::searchable($filter)
            ->sortable($sort)
            ->get();
    }
}

使用此代码,它将假设您生成的URL如下
https://your-domain.dev?name=febryan&email=febryan@example.com&sort=name_asc

$filter变量具有更广泛的范围,因为您可能有其他查询参数,这些参数与过滤数据无关。我假设的最佳实践是编写如下代码

<?php

namespace App\Http\Controllers;

use App\Users;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function getAll(Request $request)
    {
        $filter = $request->get('filters');
        $sort = $request->get('sort');

        $data = User::searchable($filter)
            ->sortable($sort)
            ->get();
    }
}

使用此代码,它将假设您生成的URL如下
https://your-domain.dev?filters[name]=febryan&filters[email]=febryan@example.com&sort=name_asc&signature=123qweasdzxc

要使用可用的搜索运算符进行过滤,您可以在查询参数中输入如下

  • 小于:filters[age]=lt:12
  • 小于等于:filters[age]=lte:12
  • 大于:filters[age]=gt:12
  • 大于等于:filters[age]=gte:12
  • 等于:filters[name]=John Doe
  • LIKE:filters[name]=like:john
  • 非:filters[name]=not:John Doe

要更改排序方向,您可以在查询参数中输入如下

  • 升序:sort=name_asc
  • 降序:sort=name_desc

或者您想声明多个排序,只需输入查询参数如下:sort=name_asc,email_desc

贡献

欢迎任何贡献!但如果你很忙,或者因为你看到我丑陋的代码而不知道如何贡献,你可以做以下事情来声明你的贡献。

为项目加星标

如果你觉得这个包很有用,并且想鼓励我维护并继续工作,只需点击星标按钮来声明你的意愿。

用一杯茶奖励我 🍵

用你国家一杯茶的价值寄给我,这样我就会有能量来维护这个包。

Ethereum: 0x8a43C741519ff8447c033E9D0a49F94A6EB76047