Laravel是一个优雅的框架,但并不代表你写的业务代码也同样优雅。
你的代码中是否还存在如下类似代码:
//是否绑定
if (isset($param['bind']) and $param['bind'] != '-1') { $t = $param['bind'] == 1 ? '!=' : '='; $rs = $rs->where('user_id', $t, 0); } //是否激活 if (isset($param['active_time']) and $param['active_time'] != '-1') { $t = $param['active_time'] == 1 ? '>=' : '<'; $rs = $rs->where('active_time', $t, '1999-01-01'); } if (isset($param['dealer']) && !empty($param['dealer'])) { $rs = $rs->whereHas('dealer', function ($query) use ($param) { $query->where('name', 'like', '%'.$param['dealer'] . '%') ->orWhere('dealer_id', '=', $param['dealer']); }); }
当业务需求要加多个查询条件的时候,往往需要改前端页面和后端页面,前端加input框,后端加if条件。
本文分享下l5-repository(原作者) / l5-repository(本文作者改后)插件,ps:虽然目前原作者已不维护了,不过貌似招了些自愿者去维护,不影响基本使用。这里提到了两个l5插件,主要介绍下后者,改动的部分可以很好支持此插件。
repository模式
此插件实现了repository层,业务逻辑相关的代码放在repository中实现,所有的repository继承公共repository,公共repository继承\Prettus\Repository\Eloquent\BaseRepository
,repository模式不了解的点这里。
控制器
控制器方面只需简单的2行即可,插件会解析请求参数,但是解析的是特定形式的查询参数,如: /users?search=user_name:133;created_at:2018-01-01,2018-01-17&searchFields=user_name:like;created_at:between
。
public function index(Request $request) { $this->userRepository->pushCriteria(new RequestCriteria($request)); $users= $this->userRepository->paginate(); }
视图
视图方面原作者只是举了几个例子,并没提供相关js去拼成后端识别的格式,所以想依靠控制器两行代码简化查询还得做些工作,本文作者不忍心这插件由于这点瑕疵而弃用,于是自己fork了个然后写了一坨jquery去支持它。平舆县人民政府于是,视图代码如下即可:
{{-- 搜索本表的user_name字段 data-search-type="like":模糊搜索 --}}
<input data-search-type="like" name="user_name" type="text"> {{-- 搜索关联表的联系电话字段 --}} <input data-search-type="like" name="userAddress.tel" type="text"> {{-- 创建区间查询 created_at between '2018-01-01' and '2018-01-17' --}} <input data-search-type=">=" data-is-between="1" name="created_at" type="text"> <input data-search-type="<=" data-is-between="1" name="created_at" type="text">
写的那段jquery便可自动将表单参数拼成l5-repositoy识别的格式,后续加新的筛选条件只要前端加input即可。