I5-repository 组件 -- Criteria

2019-01-03  本文已影响47人  爱折腾的傻小子
请求查询过滤
# 自定义 Criteria 过滤器
php artisan make:criteria My
# 在 app/Criteria 目录下创建 model 查询过滤器
# 当前控制器 唯一方法 apply() 方法 过滤model查询结果
<?php

namespace App\Criteria;

use Prettus\Repository\Contracts\CriteriaInterface;
use Prettus\Repository\Contracts\RepositoryInterface;

/**
 * Class MyCriteria
 * @package namespace App\Criteria;
 */
class MyCriteria implements CriteriaInterface
{
    /**
     * Apply criteria in query repository
     *
     * @param                     $model
     * @param RepositoryInterface $repository
     *
     * @return mixed
     */
    public function apply($model, RepositoryInterface $repository)
    {
        $model = $model->where('name','=','小河');
        return $model;
    }
}
# apply() 方法存在两参数 都是自动注入的(不需要手动传入)
# $model :第一个参数 参数当前$this->repository注入的model实例对象
# $repository :第二个参数 当前repository的一个实例,便于执行必要的查询
# 返回值:需要返回一个 $model 当前的模型实例对象

--


--

# 在指定控制器中 添加如下代码
//> 加载扩展包自定义的过滤机制
$this->repository->pushCriteria( app('Prettus\Repository\Criteria\RequestCriteria') );
$this->repository->pushCriteria( MyCriteria::class );  //> 加载自定义过滤机制

--


--

# 比如移除指定的 MyCriteria 过滤
$this->repository->popCriteria( MyCriteria::class );

--


--

# 参看 getByCritera() 方法源码
public function getByCriteria( CriteriaInterface $criteria )
{
    //> 加载过滤机制
    $this->model = $criteria->apply( $this->model, $this );
    //> 获取当前查询数据 get() 方法形式
    $results = $this->model->get();
    //> 重置model
    $this->resetModel();
    //> 返回筛选的字段结果 参考 Presenters 的用法
    return $this->parserResult( $results );
}

--

# 跳过所有的Criteria过滤 获取当前查询出来的结果 
$datum = $this->repository->skipCriteria()->all();

--


--

# app/repository.php 配置文件 Criteria 配置项
'criteria'   => [
        /*
        |--------------------------------------------------------------------------
        | 译:Criteria 允许的筛选条件 
        |--------------------------------------------------------------------------
        |
        | 'acceptedConditions'=>['=','like']
        |
        | $query->where('foo','=','bar')
        | $query->where('foo','like','bar')
        |
        */
        'acceptedConditions' => [
            '=','like','>','<','>=','<=','<>'
        ],
        /*
        |--------------------------------------------------------------------------
        | Request Params
        |--------------------------------------------------------------------------
        |
        | Request parameters that will be used to filter the query in the repository
        |
        | Params :
        |
        | - search : Searched value
        |   Ex: http://prettus.local/?search=lorem
        |
        | - searchFields : Fields in which research should be carried out
        |   Ex:
        |    http://prettus.local/?search=lorem&searchFields=name;email
        |    http://prettus.local/?search=lorem&searchFields=name:like;email
        |    http://prettus.local/?search=lorem&searchFields=name:like
        |
        | - filter : Fields that must be returned to the response object
        |   Ex:
        |   http://prettus.local/?search=lorem&filter=id,name
        |
        | - orderBy : Order By
        |   Ex:
        |   http://prettus.local/?search=lorem&orderBy=id
        |
        | - sortedBy : Sort
        |   Ex:
        |   http://prettus.local/?search=lorem&orderBy=id&sortedBy=asc
        |   http://prettus.local/?search=lorem&orderBy=id&sortedBy=desc
        |
        */
        'params'             => [
            'search'       => 'search',     //> 搜索字段
            'searchFields' => 'searchFields',//> 搜索字段自定义匹配条件
            'filter'       => 'filter',     //> 查询字段(field)
            'orderBy'      => 'orderBy',    //> 排序字段(orderBy)
            'sortedBy'     => 'sortedBy',   //> 排序方式(desc|asc)
            'with'         => 'with'        //> 懒加载形式
        ]
    ],
上一篇 下一篇

猜你喜欢

热点阅读