hashemi/queryfilter

一个简单且动态的Laravel查询包。它可以帮助你为每个参数编写单独的查询逻辑。

1.3 2021-03-08 03:52 UTC

This package is auto-updated.

Last update: 2024-09-08 11:48:27 UTC


README

一个简单且动态的Laravel查询包。它可以帮助你为每个参数编写单独的查询逻辑。

安装

您可以从composer开始。转到您的终端,然后在项目根目录中运行此命令。

composer require hashemi/queryfilter
  • 如果您使用Laravel,则Laravel将自动发现该包。如果它没有发现该包,请在您的config/app.phpproviders数组中添加以下提供者。
Hashemi\QueryFilter\QueryFilterServiceProvider::class
  • 如果您使用Lumen,则必须在您的bootstrap/app.php文件中添加以下片段。
$app->register(Hashemi\QueryFilter\QueryFilterServiceProvider::class)

用法

假设您想在User模型上使用查询过滤器进行查询。Laravel QueryFilter提供Filterable特质。您需要在您的模型上使用它。它将为您的模型添加一个filter范围。例如,

class User extends Model
{
    // Use Filterable Trait
    // ....
    use \Hashemi\QueryFilter\Filterable;
    // ....
}

现在,您需要创建您的查询过滤器文件,在其中您将编写通过传递参数生成SQL的SQL逻辑。您可以通过以下命令创建您的过滤器文件,

php artisan make:filter UserFilter

此命令将在您的app/目录中创建Filters目录。因此,您可以在app/Filters/UserFilter.php中找到该文件。过滤器类的每个方法都代表您传递的参数键。您需要传递您的参数并使用snake小写,并且您的方法名称将是apply<ParameterName>Property格式。属性名称必须以Pascal大小写编写。

class UserFilter extends \Hashemi\QueryFilter\QueryFilter
{
    public function applyIdProperty($id)
    {
        return $this->builder->where('id', '=', $id);
    }

    public function applyNameProperty($name)
    {
        return $this->builder->where('name', 'LIKE', "%$name%");
    }
}

创建该文件后,当您在控制器中使用模型进行查询时,您需要使用您的范围并传递UserFilter类作为参数。您的控制器看起来将如下所示,

class UserController extends Controller
{
    public function index(Request $request, UserFilter $filter)
    {
        $user = User::query()->filter($filter)->get();
        // do whatever
    }
}

如果您想在过滤器中传递自定义查询,您也可以在您的过滤器中这样做,

class UserController extends Controller
{
    public function index(Request $request, UserFilter $filter)
    {
        $user = User::query()->filter($filter, [
            'username' => 'ssi-anik'
        ])->get();
        // do whatever
    }
}

并且在您的app/Filters/UserFilter.php文件中,您可以这样做,

class UserFilter extends \Hashemi\QueryFilter\QueryFilter
{
    public function applyIdProperty($id)
    {
        return $this->builder->where('id', '=', $id);
    }

    public function applyNameProperty($name)
    {
        return $this->builder->where('name', 'LIKE', "%$name%");
    }
    
    public function applyUsernameProperty($username)
    {
        return $this->builder->where('username', 'LIKE', "%$username%");    
    }

}

就是这样。

约定

  • 您的*Filter类应该具有apply*Property格式的函数。其中*将被StudlyCase属性名称替换。因此,如果您的字段名称是first_name,则方法名称应该是applyFirstNameProperty()
  • 如果您向模型的过滤器范围传递了额外的数据,如Model::filter($filter, ['id' => 4]),则提供的数组将覆盖请求的数据。

注意事项

如果您的request和传递给filter范围的provided array找不到任何合适的方法,那么它将返回整个表数据,如下所示:select * from your_table。请注意此问题。

贡献

欢迎拉取请求。对于任何更改,请首先打开一个问题来讨论您想要更改的内容。