巧用欄位對映實現指定欄位的搜尋

一葉知秋發表於2017-06-26

我們在使用搜尋的時候,可能會有以下需求:

  • 資料庫欄位不被暴露出來
  • 搜尋的程式碼儘可能公用化

ok,我們來一起實現吧

  1. Model 裡定義一個public變數

    
    public $searchField =[
        'username' => 'name',
        'type'  => 'user_type',
        'game_id' => 'game_type_id',
        'status' => 'user_status',
    ]; //在這裡做欄位對映
    
    

    這裡已經完成了欄位對映的相關操作,繼續

  2. Repository裡注入這個變數

    
    public function __construct(User $user)
    {
        $this->model = $user;
        $this->searchField = $user->searchField;
    }
    
    

    此處之所以單獨將對映注入是因為:可能會有非公用查詢導致完整的物件例項變成Builder物件而導致無法取到對映欄位的情況。

  3. BaseRepositorypaginate方法裡增加以下程式碼

    
        $params = \Request::all();
    
        $fields = isset($this->searchField) ? $this->searchField :[];
    
        if (count($fields) > 0 ){
            foreach ($params as $param => $value ) {
                if (array_has($fields , $param )){
                    $this->model = $this->model->where( array_get( $fields , $param ) , $value);
                }
            }
        }
    
    

在URL裡新增你對映的引數,試試看吧~

程式碼示例:程式碼片段

最後,希望你們能看的懂我在說什麼...(我自己都不知道我在幹什麼)

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章