使Laravel篩選查詢更優雅的插件l5-repository

Laravel是一個優雅的框架,但並不表明你寫的業務代碼也一樣優雅。
你的代碼中是否還存在以下相似代碼:html

//是否綁定
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插件,主要介紹下後者,改動的部分能夠很好支持此插件。jquery

repository模式

此插件實現了repository層,業務邏輯相關的代碼放在repository中實現,全部的repository繼承公共repository,公共repository繼承\Prettus\Repository\Eloquent\BaseRepository,repository模式不瞭解的點這裏laravel

控制器

控制器方面只需簡單的2行便可,插件會解析請求參數,可是解析的是特定形式的查詢參數,如: /users?search=user_name:133;created_at:2018-01-01,2018-01-17&searchFields=user_name:like;created_at:betweengit

public function index(Request $request)
{
    $this->userRepository->pushCriteria(new RequestCriteria($request));
    $users= $this->userRepository->paginate();
}

視圖

視圖方面原做者只是舉了幾個例子,並沒提供相關js去拼成後端識別的格式,因此想依靠控制器兩行代碼簡化查詢還得作些工做,本文做者不忍心這插件因爲這點瑕疵而棄用,因而本身fork了個而後寫了一坨jquery去支持它。因而,視圖代碼以下便可:github

{{-- 搜索本表的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便可。後端

結語

第一次分享技術文,有寫的不到位的地方歡迎指出,謝謝~框架

相關文章
相關標籤/搜索