laravel 模型过滤

我们经常将 筛选的功能都写在了 控制器内,但是当筛选 字段比较多时,控制器就会很臃肿,这时我们采用模型过滤方式,让代码变得整洁 各司其职

创建 抽象类 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()]);
    }

如有不对请多指教

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值