我们经常将 筛选的功能都写在了 控制器内,但是当筛选 字段比较多时,控制器就会很臃肿,这时我们采用模型过滤方式,让代码变得整洁 各司其职
创建 抽象类 QueryFilter
<?php
namespace App\Models;
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Builder;
/**
* Copyright (C), 2021-2021, lwlCms.
* FileName: QueryFilter.php
* Description: 说明
*
* @author lwl
* @Create Date 2021/5/23 19:14
* @Update Date 2021/5/23 19:14 By lwl
* @version v1.0
*/
abstract class QueryFilter
{
protected $request;
protected $builder;
public function __construct(Request $request)
{
$this->request = $request;
}
public function apply(Builder $builder)
{
$this->builder = $builder;
foreach ($this->filters() as $name => $value) {
if (method_exists($this, $name)) {
call_user_func_array([$this, $name], array_filter([$value]));
}
}
return $this->builder;
}
public function filters()
{
return $this->request->all();
}
}
2.创建具体的过滤类并且继承 楼上的抽象类 QueryFilter
<?php
namespace App\Models\Search;
use App\Models\QueryFilter;
/**
* Copyright (C), 2021-2021, lwlCms.
* FileName: FileFilter.php
* Description: 文件过滤
*
* @author liuweiliang
* @Create Date 2021/5/23 19:18
* @Update Date 2021/5/23 19:18 By lwl
* @version v1.0
*/
class FileFilter extends QueryFilter
{
/**
* FunctionName:fileName
* Description:文件名称
* Author:lwl
* @param $fileName
* @return mixed
*/
public function fileName($fileName = '')
{
if ($fileName != '') {
return $this->builder->where('file_name', 'like', "%{$fileName}%");
}
}
/**
* FunctionName:type
* Description:类型
* Author:lwl
* @param $type
* @return mixed
*/
public function type($type = 0)
{
if ($type != 0) {
return $this->builder->where('type', '=', $type);
}
}
/**
* FunctionName:state
* Description:执行状态
* Author:lwl
* @param $state
* @return mixed
*/
public function state($state = 0)
{
if ($state != 0) {
return $this->builder->where('state', '=', $state);
}
}
}
3.对应模型追加函数
引入 : use App\Models\QueryFilter;
public function scopeFilter($query, QueryFilter $filters)
{
return $filters->apply($query);
}
此时 以上步骤 模型过滤 已经搭建好了
4.控制器中调用
引入
use App\Models\Search\FileFilter;
注入并使用
/**
* FunctionName:index
* Description:列表
* Author:lwl
* @param FileFilter $filters
* @return mixed
*/
public function index(FileFilter $filters)
{
$params = $filters->filters();//模型过滤的参数//实现筛选了
$pageSize = $params['page_size'] ?? $this->pageSize;
$fileInstance = FileModel::orderBy('created_at', 'desc')->filter($filters)->paginate($pageSize);
return $this->success(['count' => $fileInstance->total(), 'data' => $fileInstance->items()]);
}