ahmedwaleed/laravel-query-filter

1.0.0 2020-04-16 16:50 UTC

README

此包允许您从请求参数(过滤器)中为Eloquent模型添加额外的查询。

安装

您可以通过composer安装此包。

composer require ahmedwaleed/laravel-query-filter

基本用法

通过运行以下命令创建专用的查询范围类。

php artisan make:query ScopeActiveUsersQuery
// app/Queries/ScopeActiveUsersQuery.php

namespace App\Queries;

use AhmedWaleed\QueryFilter\QueryScope;

class ScopeActiveUsersQuery extends QueryScope
{
    /**
     * Add query to applicable model
     *
     * @param \Illuminate\Database\Eloquent\Builder $builder
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function apply($builder)
    {
        //

        return $builder;
    }
}

现在您需要在想要添加额外查询的模型中,使用QueryScopes特性。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use AhmedWaleed\QueryFilter\QueryScopes;

class User extends Model
{
  use QueryScopes;
  
  //
}

在您的控制器方法中,您可以添加查询,如下所示

//..
public function index()
{
  $users = User::addQuery(
    (new ScopeActiveUsersQuery())->when(request()->has('active'))
  )->get();
  
  return view('users.index', compact('users'));
}
//..

添加多个查询

$users = User::addQuery(
    (new ScopeActiveUsersQuery())->when(request()->has('active'))
)->addQuery(
    (new ScopeUsersLocationQuery())->when(request()->has('location'))
)->get();

::when($condition)方法是可选的,如果您始终想执行查询,则可以跳过。

$users = User::addQuery(new ScopeActiveUsersQuery())->get();

您可以通过构造函数传递查询所需的其他数据。

// controller
$data = ['limit' => 10, 'status' => request('active')];

$users = User::addQuery(new ScopeActiveUsersQuery($data))->get();
// App\Queries\ScopeActiveUsersQuery.php

namespace App\Queries;

use AhmedWaleed\QueryFilter\QueryScope;

class ScopeActiveUsersQuery extends QueryScope
{
    /**
     * Add query to applicable model
     *
     * @param \Illuminate\Database\Eloquent\Builder $builder
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function apply($builder)
    {
        $builder->whereStatus($this->data['status'] ?? 1)
          ->limit($this->data['limit'] ?? 50);

        return $builder;
    }
}

一种更酷的用法

对于像上面的简单查询范围可能有些过度,但如果您有大量查询和请求过滤器,要么会增加模型或控制器的大小,这个包也适用于单一责任原则,因此对于每个范围都有一个专门的类,将来也更容易维护单个查询,而不是解析一个带有请求过滤器的复杂查询。

许可

此包受(MIT)许可。