laravel技巧之查詢構造器Query Builder疊加鏈式調用方法的講解

來源:互聯網
上載者:User
這篇文章主要給大家介紹了關於laravel技巧之查詢構造器Query Builder疊加鏈式調用的相關資料,文中通過範例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友下面來一起看看吧。

查詢構造器簡介

Laravel查詢構造器(query builder)提供方便、流暢的介面,用來建立及執行資料庫尋找文法

使用PDO參數綁定,以保護應用程式免於SQL注入。因此傳入的參數不需額外轉義特殊字元

基本可以滿足所有的資料庫操作,而且在所有支援的資料庫系統上都可以執行

引言

今天給大家介紹一下laravel查詢構造器的一個小技巧,在官方文檔樣本中沒有詳細提到,也不是啥高端技巧,可能很多人在用了,不知道的同學可以看看。

在業務代碼中經常會根據不同條件來查詢,舉個簡單例子,我們現在要查詢使用者列表,按時間倒序排列,可能會有status和type作為限定條件。

一開始我是這樣寫的

 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集合。公用部分放在首尾,結構清晰,是不是高下立判啊?

而且我們還可以把$query當成參數傳入方法或函數中,將公用邏輯封裝在一起,方便多處調用:

 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:

  1. How to create multiple where clause query using Laravel Eloquent? - stackoverflow

  2. Model::query - laravelAPI

您可能感興趣的文章:

php實現斐波那契數列代碼的分享

PHP基於二分法實現數組尋找功能樣本講解

詳解php中的類與對象

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.