我有十几个筛选咋来优雅的进行编写

我现在筛选是放在controller里面进行判断拼接的,咋我想问下大家是咋弄的有没有更加优雅的方式,有一部分需要join来筛选,和一部分需要设置筛选 列的名称,大家有没有啥更加好的方式,我参考借鉴一下

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 5
nff93

我是在模型基类里封装了一些 filter,比如:

public function scopeEqFilter(Builder $q, array $fields, array $filters) {
    foreach ($fields as $field) {
        if (filled($filters[$field] ?? null)) {
            is_array($filters[$field] ? $q->whereIn($field, $filters[$field]) : $q->where($field, $filters[$field]);
        }
    }
}

public function scopeLikeFilter(Builder $q, array $fields, array $filters) {
    foreach ($fields as $field) {
        if (filled($filters[$field] ?? null)) {
            $q->where($field,  'like', '%' . $filters[$field] . '%');
        }
    }
}

// more

然后在具体的模型里封装一个 filter

public function scopeFilter(Builder $q, array $filters) {
    $q->eqFilter(['id', 'email'], $filters);
    $q->likeFilter(['title', 'content'], $filters);
    // more
}

然后控制器:

function index(Request $request) {
    return PostResource::collection(
        Post::filter($request->all())->paginate()
    );
}
10个月前 评论
10个月前 评论
Imuyu 10个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!