久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

laravel技巧之查詢構(gòu)造器Query Builder疊加鏈式調(diào)用的方法

這篇文章主要給大家介紹了關(guān)于laravel技巧之查詢構(gòu)造器Query Builder疊加鏈式調(diào)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的

查詢構(gòu)造器簡介

Laravel查詢構(gòu)造器(query builder)提供方便、流暢的接口,用來建立及執(zhí)行數(shù)據(jù)庫查找語法

使用PDO參數(shù)綁定,以保護應(yīng)用程序免于SQL注入。因此傳入的參數(shù)不需額外轉(zhuǎn)義特殊字符

基本可以滿足所有的數(shù)據(jù)庫操作,而且在所有支持的數(shù)據(jù)庫系統(tǒng)上都可以執(zhí)行

引言

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

在業(yè)務(wù)代碼中經(jīng)常會根據(jù)不同條件來查詢,舉個簡單例子,我們現(xiàn)在要查詢用戶列表,按時間倒序排列,可能會有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(),寫了四遍,如果產(chǎn)品說今天我們要正序排列,那你得改四個地方。雖然借助編輯器改一下也很快,不過要知道這只是個最簡單的例子。

看了下文檔有個when方法進行條件判斷,一堆閉包也不是很理想。我堅信肯定有更優(yōu)雅的寫法,于是上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();

用變量保存查詢構(gòu)造器實例,然后在其上疊加約束條件,最后get集合。公共部分放在首尾,結(jié)構(gòu)清晰,是不是高下立判?。?/p>

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

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

這種寫法有一個注意事項,一旦你在$query上調(diào)用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 方法針對查詢表返回一個查詢構(gòu)造器實例,允許你在查詢時鏈式調(diào)用更多約束,并使用 get 方法獲取最終結(jié)果

題外話

以前聽一些老前輩說他們不要只會百度的程序員,當時感覺真裝嗶,不都是搜索引擎,因為我那時不用google。現(xiàn)在我也不愿意和只會百度的共事了,百度只是個廣告搜索嘛,搜出來的都是些啥玩意。

google、stackoverflow真是個好東西,很多歪果仁知識豐富,解答專業(yè),從計算機歷史到操作系統(tǒng)、數(shù)據(jù)庫、各種編程語言,幫我de了好多bug。在segmentfault這么打廣告是不是不好,溜了!

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對的支持。

Reference:

  1. How to create multiple where clause query using Laravel Eloquent? - stackoverflow
  2. Model::query - laravelAPI
【網(wǎng)站聲明】本站除付費源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

下面小編就為大家分享一篇laravel ORM 只開啟created_at的幾種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要給大家介紹了如何通過源碼解析Laravel的依賴注入的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著
這篇文章主要給大家介紹了關(guān)于Laravel中unique和exists驗證規(guī)則的優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面
最近在使用laravel5.5,利用其實現(xiàn)了一個功能,下面分享給大家,這篇文章主要給大家介紹了關(guān)于Laravel 5.5基于內(nèi)置的Auth模塊如何實現(xiàn)前后臺登陸的相關(guān)資料,文中通過示例代碼介紹的非
laravel 的隊列服務(wù)對各種不同的后臺隊列服務(wù)提供了統(tǒng)一的 API,下面這篇文章通過源碼分析給大家介紹了關(guān)于 Laravel 重復(fù)執(zhí)行同一個隊列任務(wù)的原因,文中通過示例代碼介紹的非常詳細
這篇文章主要給大家介紹了關(guān)于 Laravel Redis 多個進程同時取隊列問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友下面來
主站蜘蛛池模板: 99精品国产一区二区青青牛奶 | 国产日韩一区二区三区 | 台湾佬成人网 | 国产毛片视频 | 久久99视频 | 在线视频国产一区 | 日韩av在线播 | 男女网站免费观看 | 日日夜夜精品免费视频 | 欧美日韩一区二区三区视频 | 国产一区二区三区免费 | 天天干天天操天天爽 | 国产精品久久在线观看 | 欧美一级黄带 | 老妇激情毛片免费 | 一区二区三区欧美 | 日韩av一二三区 | 亚洲精品久久久久久国产精华液 | 视频一区二区在线观看 | 日韩亚洲一区二区 | 毛片高清 | 精品久久久久久国产 | 日韩一| 久久久综合色 | 九色在线观看 | 国产精品久久久精品 | 久久国产精品视频 | 国产精品久久久av | 一区二区精品 | 午夜在线精品 | 日日天天 | 中文字幕精品视频 | 国产精品欧美一区二区三区 | 国产精品视频一区二区三区 | 91视在线国内在线播放酒店 | 中文字幕在线第二页 | 精品国产aⅴ| 国产中文字幕网 | 亚洲精品在线播放 | 久草新在线 | 亚洲精品一区二区三区蜜桃久 |