chocofamilyme/phalcon-query-builder-filters

用于处理查询构建器过滤的Phalcon包

1.0.0 2021-06-15 04:52 UTC

This package is auto-updated.

Last update: 2024-09-15 11:58:44 UTC


README

用于通过Query Builder框架动态过滤数据的库

安装

使用Composer

$ composer require chocofamilyme/phalcon-query-builder-filters

使用

  1. 需要创建一个继承自抽象类 Chocofamily\QueryBuilderFilters\BaseFilter 的过滤器类

然后你需要定义过滤器的逻辑,遵循以下规则
  • 没有对应过滤方法的查询字符串将被忽略
  • 空字符串将被忽略
  • 所有键默认转换为camelCase
  • 每个查询键的值将被注入到对应的过滤方法中。
  • 你可以通过使用 $this->builder 来访问Builder实例 (Phalcon\Mvc\Model\Query\Builder)

示例:

为了根据以下URL请求过滤数据

http://yourdomain.com/api/users?gender=male&working=1


我们需要编写以下方法

namespace RestAPI\Models\Filters;

use Chocofamily\QueryBuilderFilters\BaseFilter;

class UserFilter extends BaseFilter
{
    public function gender($value)
    {
        return $this->builder->andWhere('RestAPI\Models\User.gender = :gender:', [
                    'gender' =>  $value
                ]);
    }

    public function working($value)
    {
        return $this->builder->andWhere('RestAPI\Models\Profile.is_working = :isWorking:', [
                            'isWorking' =>  $value
                        ]);
    }
}

2. 在Phalcon模型中,需要添加实现接口 Chocofamily\QueryBuilderFilters\Contracts\HasFilters 并实现方法 getFilterClass

namespace RestAPI\Models;

use Chocofamily\QueryBuilderFilters\Contracts\HasFilters;
use RestAPI\Models\Filters\UserFilter; 
use Phalcon\Mvc\Model;

class User extends Model implements HasFilters
{

    /**
     * @return string
     */
    public function getFilterClass(): string
    {
        return UserFilter::class;
    }

}

3. 现在,我们可以使用过滤功能

public function getFilteredUsers()
{
    $filterHandler = new FilterHandler();
    
    $filters = [
        'is_working'        =>  true,
        'gender'            =>  1,
        'not_exist_column'  =>  'test' // так как такого метода у нас нету, этот фильтр проигнорируется
    ];
	
    $builder = $this->modelsManager->createBuilder()
                            ->columns(
                                [
                                    'RestAPI\Models\User.id',
                                    'RestAPI\Models\User.name',
                                    'RestAPI\Models\User.gender',
                                    'RestAPI\Models\Profile.is_working',
                                    'RestAPI\Models\Profile.is_active'
                                ]
                            )
                            ->from('RestAPI\Models\User')
                            ->innerJoin('RestAPI\Models\Profile', 'RestAPI\Models\User.id = RestAPI\Models\Profile.user_id')
                            ->orderBy('is_active DESC');
							
    $filteredBuilder = $filterHandler->handle($builder, $filters);
    return $filteredBuilder->getQuery()->execute();
}

4. 为了方便,还可以在DI中添加过滤器处理器

use Chocofamily\QueryBuilderFilters\FilterHandler;

$di = \Phalcon\Di::getDefault();
    $di->set('query-builder-filter', function () use ($di) {
      return new FilterHandler();
    });  

待办事项

  • 为请求添加别名
  • 对代码进行单元测试覆盖
  • 编写文档