laravel技巧之查詢構(gòu)造器Query Builder疊加鏈?zhǔn)秸{(diào)用的方法
查詢構(gòu)造器簡(jiǎn)介
Laravel查詢構(gòu)造器(query builder)提供方便、流暢的接口,用來建立及執(zhí)行數(shù)據(jù)庫(kù)查找語法
使用PDO參數(shù)綁定,以保護(hù)應(yīng)用程序免于SQL注入。因此傳入的參數(shù)不需額外轉(zhuǎn)義特殊字符
基本可以滿足所有的數(shù)據(jù)庫(kù)操作,而且在所有支持的數(shù)據(jù)庫(kù)系統(tǒng)上都可以執(zhí)行
引言
今天給大家介紹一下laravel查詢構(gòu)造器的一個(gè)小技巧,在官方文檔示例中沒有詳細(xì)提到,也不是啥高端技巧,可能很多人在用了,不知道的同學(xué)可以看看。
在業(yè)務(wù)代碼中經(jīng)常會(huì)根據(jù)不同條件來查詢,舉個(gè)簡(jiǎn)單例子,我們現(xiàn)在要查詢用戶列表,按時(shí)間倒序排列,可能會(huì)有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(); }
這個(gè)代碼真的很丑陋,很多公共代碼,比如->latest()->get(),寫了四遍,如果產(chǎn)品說今天我們要正序排列,那你得改四個(gè)地方。雖然借助編輯器改一下也很快,不過要知道這只是個(gè)最簡(jiǎn)單的例子。
看了下文檔有個(gè)when方法進(jìn)行條件判斷,一堆閉包也不是很理想。我堅(jiān)信肯定有更優(yōu)雅的寫法,于是上stackoverflow搜了一波,果然萬能的歪果仁給了我答案。
改進(jìn)后的寫法:
$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);
這種寫法有一個(gè)注意事項(xiàng),一旦你在$query上調(diào)用where等約束方法,就會(huì)改變此query,有時(shí)候我們需要提前clone一個(gè)query。
舉例說明,比如我們同時(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(); // 這樣寫得到得是type = 1 and $type = 2
laravel的文檔里雖然沒有寫這種示例,但是提了一下:
你可以使用 DB facade 的 table 方法開始查詢。這個(gè) table 方法針對(duì)查詢表返回一個(gè)查詢構(gòu)造器實(shí)例,允許你在查詢時(shí)鏈?zhǔn)秸{(diào)用更多約束,并使用 get 方法獲取最終結(jié)果
題外話
以前聽一些老前輩說他們不要只會(huì)百度的程序員,當(dāng)時(shí)感覺真裝嗶,不都是搜索引擎,因?yàn)槲夷菚r(shí)不用google。現(xiàn)在我也不愿意和只會(huì)百度的共事了,百度只是個(gè)廣告搜索嘛,搜出來的都是些啥玩意。
google、stackoverflow真是個(gè)好東西,很多歪果仁知識(shí)豐富,解答專業(yè),從計(jì)算機(jī)歷史到操作系統(tǒng)、數(shù)據(jù)庫(kù)、各種編程語言,幫我de了好多bug。在segmentfault這么打廣告是不是不好,溜了!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
Reference:
- How to create multiple where clause query using Laravel Eloquent? - stackoverflow
- Model::query - laravelAPI
- Laravel框架DB facade數(shù)據(jù)庫(kù)操作詳解
- Laravel5.7 數(shù)據(jù)庫(kù)操作遷移的實(shí)現(xiàn)方法
- PHP開發(fā)框架Laravel數(shù)據(jù)庫(kù)操作方法總結(jié)
- Laravel5中實(shí)現(xiàn)模糊匹配加多條件查詢功能的方法
- 使用Laravel中的查詢構(gòu)造器實(shí)現(xiàn)增刪改查功能
- 解決laravel查詢構(gòu)造器中的別名問題
- Laravel 5框架學(xué)習(xí)之Eloquent (laravel 的ORM)
- 詳解PHP的Laravel框架中Eloquent對(duì)象關(guān)系映射使用
- Laravel 5框架學(xué)習(xí)之Eloquent 關(guān)系
- Laravel Eloquent ORM 實(shí)現(xiàn)查詢表中指定的字段
- Laravel5.7 Eloquent ORM快速入門詳解
- laravel框架數(shù)據(jù)庫(kù)操作、查詢構(gòu)建器、Eloquent ORM操作實(shí)例分析
相關(guān)文章
Yii2框架制作RESTful風(fēng)格的API快速入門教程
Yii提供了一整套用來簡(jiǎn)化實(shí)現(xiàn)RESTful風(fēng)格的WebService服務(wù)的API。這篇文章主要介紹了Yii2框架制作RESTful風(fēng)格的API快速入門教程的相關(guān)資料,需要的朋友可以參考下2016-11-11php實(shí)現(xiàn)paypal 授權(quán)登錄
本文給大家分享的是php實(shí)現(xiàn)的paypal授權(quán)登錄的代碼,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-05-05PHP file_get_contents函數(shù)讀取遠(yuǎn)程數(shù)據(jù)超時(shí)的解決方法
這篇文章主要介紹了PHP file_get_contents函數(shù)讀取遠(yuǎn)程數(shù)據(jù)超時(shí)的解決方法,本文直接給出解決方法代碼,需要的朋友可以參考下2015-05-05thinkPHP+PHPExcel實(shí)現(xiàn)讀取文件日期的方法(含時(shí)分秒)
這篇文章主要介紹了thinkPHP+PHPExcel實(shí)現(xiàn)讀取文件日期的方法,可實(shí)現(xiàn)針對(duì)時(shí)分秒的形式進(jìn)行讀取的功能,涉及PHPExcel中ExcelToPHP函數(shù)的相關(guān)使用方法,需要的朋友可以參考下2016-07-07php設(shè)計(jì)模式之觀察者模式實(shí)例詳解【星際爭(zhēng)霸游戲案例】
這篇文章主要介紹了php設(shè)計(jì)模式之觀察者模式,結(jié)合星際爭(zhēng)霸游戲案例形式分析了php觀察者模式相關(guān)概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03php序列化函數(shù)serialize() 和 unserialize() 與原生函數(shù)對(duì)比
這篇文章主要介紹了php序列化函數(shù)serialize() 和 unserialize() 與php原生序列化方法對(duì)比,有需要的小伙伴可以參考下。2015-05-05thinkphp表單上傳文件并將文件路徑保存到數(shù)據(jù)庫(kù)中
這篇文章主要介紹了thinkphp表單上傳文件并將文件路徑保存到數(shù)據(jù)庫(kù)中的相關(guān)資料,需要的朋友可以參考下2016-07-07PHPStorm2020.1永久激活及下載更新至2020(推薦)
這篇文章主要介紹了PHPStorm2020.1永久激活及下載更新至2020,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09