成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

laravel使用技巧之查詢構(gòu)造器Query Builder疊加鏈?zhǔn)秸{(diào)用

weapon / 1854人閱讀

摘要:今天給大家介紹一下查詢構(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

相關(guān)文章

  • Laravel 5.7 最佳實(shí)踐和開(kāi)發(fā)技巧分享

    摘要:當(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)試的...

    ninefive 評(píng)論0 收藏0
  • Laravel 學(xué)習(xí)筆記 Query Builder 源碼解析(中)

    說(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...

    zhou_you 評(píng)論0 收藏0
  • Laravel學(xué)習(xí)筆記Query Builder源碼解析(上)

    摘要:說(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)...

    Steve_Wang_ 評(píng)論0 收藏0
  • Laravel Query Builder 復(fù)雜查詢案例:子查詢實(shí)現(xiàn)分區(qū)查詢 partition b

    摘要:案例案例在文章列表中附帶上前條評(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ū)查詢案例,需...

    littleGrow 評(píng)論0 收藏0
  • Laravel核心解讀--Database(四) 模型關(guān)聯(lián)

    摘要:為關(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è)...

    gekylin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<