alfredoihublab/query-filter-laravel

由课程面板 Styde 提供的 eloquent orm 查询轻松应用过滤器

dev-master 2023-05-09 22:05 UTC

This package is not auto-updated.

Last update: 2024-09-25 05:10:56 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