摘要:今天給大家介紹一下查詢構造器的一個小技巧,在官方文檔示例中沒有詳細提到,也不是啥高端技巧,可能很多人在用了,不知道的同學可以看看。改進后的寫法如果用用變量保存查詢構造器實例,然后在其上疊加約束條件,最后集合。
今天給大家介紹一下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:
How to create multiple where clause query using Laravel Eloquent? - stackoverflow
Model::query - laravelAPI
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26197.html
摘要:當查詢數據時,本地范圍允許我們創建自己的查詢構造器鏈式方法。這樣便會知道這是一個本地范圍并且可以在查詢構造器中使用。某些查詢構造器不可用或者說可用但是方法名不同,關于這些請查閱所有集合的方法。 showImg(https://segmentfault.com/img/remote/1460000017877956?w=800&h=267); Laravel 因可編寫出干凈,可用可調試的...
說明:本篇主要學習數據庫連接階段和編譯SQL語句部分相關源碼。實際上,上篇已經聊到Query Builder通過連接工廠類ConnectionFactory構造出了MySqlConnection實例(假設驅動driver是mysql),在該MySqlConnection中主要有三件利器:IlluminateDatabaseMysqlConnector;IlluminateDatabaseQuery...
摘要:說明本文主要學習模塊的源碼。這里,就已經得到了鏈接器實例了,該中還裝著一個,下文在其使用時再聊下其具體連接邏輯。 說明:本文主要學習Laravel Database模塊的Query Builder源碼。實際上,Laravel通過Schema Builder來設計數據庫,通過Query Builder來CURD數據庫。Query Builder并不復雜或神秘,只是在PDO擴展的基礎上又開...
摘要:案例案例在文章列表中附帶上前條評論,在獲取文章列表時同時把每個文章的前條評論一同查詢出來。這是典型分區查詢案例,需要根據表中的字段進行分區,同時根據條件進行排序,把符合條件的前條是數據取出來。查詢語句中定義變量以及函數的使用如何構建子查詢。 案例 案例:Laravel 在文章列表中附帶上前10條評論?,在獲取文章列表時同時把每個文章的前10條評論一同查詢出來。 這是典型分區查詢案例,需...
摘要:為關聯關系設置約束子模型的等于父模型的上面設置的字段的值子類實現這個抽象方法通過上面代碼看到創建實例時主要是做了一些配置相關的操作,設置了子模型父模型兩個模型的關聯字段和關聯的約束。不過當查詢父模型時,可以預加載關聯數據。 Database 模型關聯 上篇文章我們主要講了Eloquent Model關于基礎的CRUD方法的實現,Eloquent Model中除了基礎的CRUD外還有一個...
閱讀 1668·2023-04-26 00:30
閱讀 3145·2021-11-25 09:43
閱讀 2868·2021-11-22 14:56
閱讀 3183·2021-11-04 16:15
閱讀 1137·2021-09-07 09:58
閱讀 2014·2019-08-29 13:14
閱讀 3101·2019-08-29 12:55
閱讀 982·2019-08-29 10:57