luilliarcec/laravel-query-filter

此包已被废弃且不再维护。作者建议使用styde/laravel-query-filter包。

为您的Laravel查询应用过滤器。

dev-master 2021-04-05 12:40 UTC

This package is auto-updated.

Last update: 2021-04-05 12:40:58 UTC


README

StydeForm

查询过滤器

Latest Version on Packagist Quality Score Total Downloads

以安全简便的方式让用户过滤数据库查询。

安装

您可以通过composer安装此包。

composer require styde/query-filter

使用方法

您可以使用make:query命令创建一个新的QueryClass,或者使用make:filter命令创建一个新的FilterClass。

一旦创建了这些类,您必须在其中集成所需的逻辑。记住,FilterClass是作为对请求进行的查询的过滤器。

您必须注意,您的Query类必须与其创建的模型关联,这是至关重要的,否则您会得到错误。

以下是一个关于使用User模型的示例。

make:query命令
php artisan make:query UserQuery

此命令将创建一个名为User Query的PHP文件,结构如下。

<?php

namespace App\Queries;

use Styde\QueryFilter\QueryBuilder;

class UserQuery extends QueryBuilder
{
    //
}
make:query命令
php artisan make:query UserFilter

此命令将创建一个名为User Filter的PHP文件,结构如下。

<?php

namespace App\Filters;

use Styde\QueryFilter\AbstractFilter;

class UserFilter extends AbstractFilter
{
    /**
     * Get the validation rules that apply to the request filter.
     *
     * @return array
     */
    public function rules(): array
    {
        return [
            //
        ];
    }
}

一旦创建了这些类,您必须按照以下方式将QueryClass与相关模型关联。如果您不想创建QueryClass,可以使用BaseQuery Styde\LaravelQueryFilter\QueryBuilder,命令创建的查询将从此扩展。

<?php

namespace App\Models;

use App\Filters\UserFilter;
use App\Queries\UserQuery;

class User extends Authenticatable
{
    //

    // We associate the query
    public function newEloquentBuilder($query)
    {
        return new UserQuery($query);
    }

    // We associate the filter
    public function newQueryFilter()
    {
        return new UserFilter;
    }
}

<?php

namespace App\Models;

use App\Filters\UserFilter;
use Styde\QueryFilter\QueryBuilder;

class User extends Authenticatable
{
    //

    // We associate the query
    public function newEloquentBuilder($query)
    {
        return new QueryBuilder($query);
    }

    // We associate the filter
    public function newQueryFilter()
    {
        return new UserFilter;
    }
}

完成此操作后,我们将创建一个基本的查询过滤器和一个基本的查询,以帮助我们通过电子邮件搜索用户。

在您的UserQuery文件中
<?php

namespace App\Queries;

use Styde\QueryFilter\QueryBuilder;

class UserQuery extends QueryBuilder
{
    public function findByEmail($email)
    {
        return $this->where(compact('email'))->first();
    }
}

现在您可以在以下方式中使用此查询:

// Anywhere in your project

$user = User::query()->findByEmail('luilliarcec@gmail.com');
在您的UserFilter文件中

通常,当我们创建记录列表时,通常是我们控制器中的index方法,我们会使用该情况来解释过滤器。

<?php

namespace App\Filters;

use Styde\QueryFilter\AbstractFilter;

class UserFilter extends AbstractFilter
{
    /**
     * Get the validation rules that apply to the request filter.
     *
     * @return array
     */
    public function rules(): array
    {
        return [
            'search' => 'filled'
        ];
    }

    public function search($query, $value)
    {
        return $query->where('email', 'like', "{$value}%")
            ->orWhere('name', 'like', "{$value}%");
    }
}

在您的UserController中

<?php

namespace App\Http\Controllers;

class UserController extends Controller
{
    public function index()
    {
        $users = User::query()->applyFilters()->paginate();

        return view('users.index', compact('users'));
    }
}

这样,您就可以返回过滤后的记录。

注意
  • 应用的是UserFilter中传递的规则所指定的过滤器,如果您想添加更多过滤器,必须在rules中放入请求中到达的输入名称,并在过滤器中创建一个以驼峰命名法命名的函数。

  • 如果您为同一模型有多个过滤器类,您可以通过控制器以依赖注入的方式应用它,即使您想传递自己的值,也可以通过将一个键值对数组作为第二个参数传递来实现。

示例

在您的UserController中

<?php

namespace App\Http\Controllers;

use Styde\QueryFilter\Support\Sortable;

class UserController extends Controller
{
    public function index()
    {
        $otherData = [...];

        $users = User::query()->applyFilters(new OtherUserFilter(), $otherData)->paginate();

        return view('users.index', compact('users'));
    }

    // If you want to use the sort functionality on a collection 
    // and not on paginated data, 
    // you need to inject or instantiate the sortable support class.

    public function index(Sortable $sortable)
    {
        $otherData = [...];

        $users = User::query()->applyFilters(new OtherUserFilter(), $otherData)->get();

        return view('users.index', compact('users', 'sortable'));
    }
}

变更日志

请参阅变更日志以获取最近更改的更多信息。

贡献

请参阅贡献指南以获取详细信息。

安全

如果您发现任何与安全相关的问题,请通过电子邮件admin@styde.netluilliarcec@gmail.com联系,而不是使用问题跟踪器。

鸣谢

许可

MIT许可(MIT)。请参阅许可文件以获取更多信息。

Laravel 包模板

此包是使用Laravel 包模板生成的。