摘要:今天給大家介紹一下查詢構(gòu)造器的一個(gè)小技巧,在官方文檔示例中沒(méi)有詳細(xì)提到,也不是啥高端技巧,可能很多人在用了,不知道的同學(xué)可以看看。改進(jìn)后的寫(xiě)法如果用用變量保存查詢構(gòu)造器實(shí)例,然后在其上疊加約束條件,最后集合。
今天給大家介紹一下laravel查詢構(gòu)造器的一個(gè)小技巧,在官方文檔示例中沒(méi)有詳細(xì)提到,也不是啥高端技巧,可能很多人在用了,不知道的同學(xué)可以看看。
在業(yè)務(wù)代碼中經(jīng)常會(huì)根據(jù)不同條件來(lái)查詢,舉個(gè)簡(jiǎn)單例子,我們現(xiàn)在要查詢用戶列表,按時(shí)間倒序排列,可能會(huì)有status和type作為限定條件。
一開(kāi)始我是這樣寫(xiě)的
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(); }
這個(gè)代碼真的很丑陋,很多公共代碼,比如->latest()->get(),寫(xiě)了四遍,如果產(chǎn)品說(shuō)今天我們要正序排列,那你得改四個(gè)地方。雖然借助編輯器改一下也很快,不過(guò)要知道這只是個(gè)最簡(jiǎn)單的例子。
看了下文檔有個(gè)when方法進(jìn)行條件判斷,一堆閉包也不是很理想。我堅(jiān)信肯定有更優(yōu)雅的寫(xiě)法,于是上stackoverflow搜了一波,果然萬(wàn)能的歪果仁給了我答案。
改進(jìn)后的寫(xiě)法:
$query = User::query(); // 如果用DB: $query = DB::table("user"); if ($status) { $query->where("status", $status); } if ($type) { $query->where("type", $type); } $users = $query->latest()->get();
用變量保存查詢構(gòu)造器實(shí)例,然后在其上疊加約束條件,最后get集合。公共部分放在首尾,結(jié)構(gòu)清晰,是不是高下立判???
而且我們還可以把$query當(dāng)成參數(shù)傳入方法或函數(shù)中,將公共邏輯封裝在一起,方便多處調(diào)用:
function foo($query) { $query->with(["girl", "gay"]) ->latest() ->get(); } $query = User::query(); $users = foo($query);
這種寫(xiě)法有一個(gè)注意事項(xiàng),一旦你在$query上調(diào)用where等約束方法,就會(huì)改變此query,有時(shí)候我們需要提前clone一個(gè)query。
舉例說(shuō)明,比如我們同時(shí)要拿到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(); // 錯(cuò)誤 $users_2 = $query_1->where("type", 1)->latest()->get(); // 這樣寫(xiě)得到得是type = 1 and $type = 2
laravel的文檔里雖然沒(méi)有寫(xiě)這種示例,但是提了一下:
你可以使用 DB facade 的 table 方法開(kāi)始查詢。這個(gè) table 方法針對(duì)查詢表返回一個(gè)查詢構(gòu)造器實(shí)例,允許你在查詢時(shí)鏈?zhǔn)秸{(diào)用更多約束,并使用 get 方法獲取最終結(jié)果
題外話
以前聽(tīng)一些老前輩說(shuō)他們不要只會(huì)百度的程序員,當(dāng)時(shí)感覺(jué)真裝嗶,不都是搜索引擎,因?yàn)槲夷菚r(shí)不用google?,F(xiàn)在我也不愿意和只會(huì)百度的共事了,百度只是個(gè)廣告搜索嘛,搜出來(lái)的都是些啥玩意。
google、stackoverflow真是個(gè)好東西,很多歪果仁知識(shí)豐富,解答專(zhuān)業(yè),從計(jì)算機(jī)歷史到操作系統(tǒng)、數(shù)據(jù)庫(kù)、各種編程語(yǔ)言,幫我de了好多bug。在segmentfault這么打廣告是不是不好,溜了!
Reference:
How to create multiple where clause query using Laravel Eloquent? - stackoverflow
Model::query - laravelAPI
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26197.html
摘要:當(dāng)查詢數(shù)據(jù)時(shí),本地范圍允許我們創(chuàng)建自己的查詢構(gòu)造器鏈?zhǔn)椒椒?。這樣便會(huì)知道這是一個(gè)本地范圍并且可以在查詢構(gòu)造器中使用。某些查詢構(gòu)造器不可用或者說(shuō)可用但是方法名不同,關(guān)于這些請(qǐng)查閱所有集合的方法。 showImg(https://segmentfault.com/img/remote/1460000017877956?w=800&h=267); Laravel 因可編寫(xiě)出干凈,可用可調(diào)試的...
說(shuō)明:本篇主要學(xué)習(xí)數(shù)據(jù)庫(kù)連接階段和編譯SQL語(yǔ)句部分相關(guān)源碼。實(shí)際上,上篇已經(jīng)聊到Query Builder通過(guò)連接工廠類(lèi)ConnectionFactory構(gòu)造出了MySqlConnection實(shí)例(假設(shè)驅(qū)動(dòng)driver是mysql),在該MySqlConnection中主要有三件利器:IlluminateDatabaseMysqlConnector;IlluminateDatabaseQuery...
摘要:說(shuō)明本文主要學(xué)習(xí)模塊的源碼。這里,就已經(jīng)得到了鏈接器實(shí)例了,該中還裝著一個(gè),下文在其使用時(shí)再聊下其具體連接邏輯。 說(shuō)明:本文主要學(xué)習(xí)Laravel Database模塊的Query Builder源碼。實(shí)際上,Laravel通過(guò)Schema Builder來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù),通過(guò)Query Builder來(lái)CURD數(shù)據(jù)庫(kù)。Query Builder并不復(fù)雜或神秘,只是在PDO擴(kuò)展的基礎(chǔ)上又開(kāi)...
摘要:案例案例在文章列表中附帶上前條評(píng)論,在獲取文章列表時(shí)同時(shí)把每個(gè)文章的前條評(píng)論一同查詢出來(lái)。這是典型分區(qū)查詢案例,需要根據(jù)表中的字段進(jìn)行分區(qū),同時(shí)根據(jù)條件進(jìn)行排序,把符合條件的前條是數(shù)據(jù)取出來(lái)。查詢語(yǔ)句中定義變量以及函數(shù)的使用如何構(gòu)建子查詢。 案例 案例:Laravel 在文章列表中附帶上前10條評(píng)論?,在獲取文章列表時(shí)同時(shí)把每個(gè)文章的前10條評(píng)論一同查詢出來(lái)。 這是典型分區(qū)查詢案例,需...
摘要:為關(guān)聯(lián)關(guān)系設(shè)置約束子模型的等于父模型的上面設(shè)置的字段的值子類(lèi)實(shí)現(xiàn)這個(gè)抽象方法通過(guò)上面代碼看到創(chuàng)建實(shí)例時(shí)主要是做了一些配置相關(guān)的操作,設(shè)置了子模型父模型兩個(gè)模型的關(guān)聯(lián)字段和關(guān)聯(lián)的約束。不過(guò)當(dāng)查詢父模型時(shí),可以預(yù)加載關(guān)聯(lián)數(shù)據(jù)。 Database 模型關(guān)聯(lián) 上篇文章我們主要講了Eloquent Model關(guān)于基礎(chǔ)的CRUD方法的實(shí)現(xiàn),Eloquent Model中除了基礎(chǔ)的CRUD外還有一個(gè)...
閱讀 1688·2023-04-26 00:30
閱讀 3161·2021-11-25 09:43
閱讀 2890·2021-11-22 14:56
閱讀 3200·2021-11-04 16:15
閱讀 1160·2021-09-07 09:58
閱讀 2032·2019-08-29 13:14
閱讀 3118·2019-08-29 12:55
閱讀 998·2019-08-29 10:57