laravel使用技巧之查詢構造器Query Builder疊加鏈式調用

今天給你們介紹一下laravel查詢構造器的一個小技巧,在官方文檔示例中沒有詳細提到,也不是啥高端技巧,可能不少人在用了,不知道的同窗能夠看看。php

在業務代碼中常常會根據不一樣條件來查詢,舉個簡單例子,咱們如今要查詢用戶列表,按時間倒序排列,可能會有status和type做爲限定條件。html

一開始我是這樣寫的laravel

if($status && $type) {
        $users = User::where('status', $status)->where('type', $type)->latest()->get();
    } else if ($status) {
        $users = User::where('status', $status)->latest()->get();   
    } else if ($type) {
        $users = User::where('status', $type)->latest()->get();
    } else {
        $users = User::latest()->get();        
    }

這個代碼真的很醜陋,不少公共代碼,好比->latest()->get(),寫了四遍,若是產品說今天咱們要正序排列,那你得改四個地方。雖然藉助編輯器改一下也很快,不過要知道這只是個最簡單的例子。程序員

看了下文檔有個when方法進行條件判斷,一堆閉包也不是很理想。我堅信確定有更優雅的寫法,因而上stackoverflow搜了一波,果真萬能的歪果仁給了我答案。數據庫

改進後的寫法:編程

$query = User::query();
    // 若是用DB: $query = DB::table('user');
    
    if ($status) {
        $query->where('status', $status);
    }

    if ($type) {
        $query->where('type', $type);
    }
    
    $users = $query->latest()->get();

用變量保存查詢構造器實例,而後在其上疊加約束條件,最後get集合。公共部分放在首尾,結構清晰,是否是高下立判啊?segmentfault

並且咱們還能夠把$query當成參數傳入方法或函數中,將公共邏輯封裝在一塊兒,方便多處調用:api

function foo($query) {
        $query->with(['girl', 'gay'])
              ->latest()
              ->get();
    }
    
    
    $query = User::query();
    $users = foo($query);

這種寫法有一個注意事項,一旦你在$query上調用where等約束方法,就會改變此query,有時候咱們須要提早clone一個query。閉包

舉例說明,好比咱們同時要拿到type爲1和2的users編程語言

$query_1 = User::query();
    $query_2 = clone $query_1;
   
   
    $users_1 = $query_1->where('type', 1)->latest()->get();
    $users_2 = $query_2->where('type', 2)->latest()->get();
    // 錯誤 $users_2 = $query_1->where('type', 1)->latest()->get();
    // 這樣寫獲得得是type = 1 and $type = 2

laravel的文檔裏雖然沒有寫這種示例,可是提了一下:

你可使用 DB facade 的 table 方法開始查詢。這個 table 方法針對查詢表返回一個查詢構造器實例,容許你在查詢時鏈式調用更多約束,並使用 get 方法獲取最終結果

題外話

之前聽一些老前輩說他們不要只會百度的程序員,當時感受真裝嗶,不都是搜索引擎,由於我那時不用google。如今我也不肯意和只會百度的共事了,百度只是個廣告搜索嘛,搜出來的都是些啥玩意。

google、stackoverflow真是個好東西,不少歪果仁知識豐富,解答專業,從計算機歷史到操做系統、數據庫、各類編程語言,幫我de了好多bug。在segmentfault這麼打廣告是否是很差,溜了!

Reference:
How to create multiple where clause query using Laravel Eloquent? - stackoverflow
Model::query - laravelAPI

相關文章
相關標籤/搜索