fguzman/query-filter-laravel

由课程面板 Styde 开发,轻松将过滤器应用于您的 eloquent orm 查询

0.1.3 2024-04-07 06:39 UTC

This package is auto-updated.

Last update: 2024-09-07 07:29:29 UTC


README

本项目利用 Composer 来管理其依赖项。因此,在安装此包之前,请确保您的机器上已安装 Composer。

运行以下命令

composer --version

安装

通过 Composer 安装包

composer require fguzman/query-filter-laravel

如何使用

使用以下命令创建新的 QueryClass:make:query,然后创建新的 FilterClass,可以使用 make:filter 命令。

一旦创建了这些类,您必须在每个类中实现所需的逻辑。

注意:您的查询类必须与您创建它的模型相关联,这样在过滤器中就不会出现错误。

例如,考虑 User 模型

php artisan make:query UserQuery

上述命令将创建一个名为 UserQuery 的文件,其结构如下

<?php

namespace App\Models\Queries;

use Fguzman\QueryBuilder;

class UserQuery extends QueryBuilder
{
    //
}

然后是下一个命令

php artisan make:filter FilterUser

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

<?php

namespace App\Filters;

use Fguzman\QueryFilter;

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

一旦创建了这些类,您必须将 QueryClass 关联到模型。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Filters\UserFilter;
use App\Models\Queries\UserQuery;

class User extends Model
{
    public function newQueryFilter()
    {
        return new UserFilter();
    }

    public function newEloquentBuilder($query)
    {
        return new UserQuery($query);
    }
}

一旦关联了 QueryClass,您就可以创建以下第一个基本查询过滤器

在您的 UserQuery 文件中

<?php

namespace App\Models\Queries;

use Fguzman\QueryBuilder;

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

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

User::query()->findByName('John');

现在,对于 UserFilter 文件,您可以使用以下方式

<?php

namespace App\Filters;

use Fguzman\QueryFilter;
use App\Models\Queries\UserQuery;

class UserFilter extends QueryFilter
{
    public function rules(): array
    {
        return [
            'search' => 'filled',
        ];
    }

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

现在,在您的 UserController 中

<?php

namespace App\Http\Controllers;

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

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

安全

如果您发现任何安全问题,请通过电子邮件联系我们:felipe-guzman.c@hotmail.com