国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - laravel技巧之查詢構造器Query Builder疊加鏈式調用的方法

laravel技巧之查詢構造器Query Builder疊加鏈式調用的方法

2021-07-21 15:41wind5o PHP教程

這篇文章主要給大家介紹了關于laravel技巧之查詢構造器Query Builder疊加鏈式調用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友下面來一起看看吧。

查詢構造器簡介

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

使用PDO參數綁定,以保護應用程序免于SQL注入。因此傳入的參數不需額外轉義特殊字符

基本可以滿足所有的數據庫操作,而且在所有支持的數據庫系統上都可以執行

引言

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

在業務代碼中經常會根據不同條件來查詢,舉個簡單例子,我們現在要查詢用戶列表,按時間倒序排列,可能會有status和type作為限定條件。

一開始我是這樣寫的

?
1
2
3
4
5
6
7
8
9
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搜了一波,果然萬能的歪果仁給了我答案。

改進后的寫法:

?
1
2
3
4
5
6
7
8
9
$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當成參數傳入方法或函數中,將公共邏輯封裝在一起,方便多處調用:

?
1
2
3
4
5
6
7
function foo($query) {
 $query->with(['girl', 'gay'])
   ->latest()
   ->get();
}
$query = User::query();
$users = foo($query);

這種寫法有一個注意事項,一旦你在$query上調用where等約束方法,就會改變此query,有時候我們需要提前clone一個query。

舉例說明,比如我們同時要拿到type為1和2的users

?
1
2
3
4
5
6
$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:

  1. How to create multiple where clause query using Laravel Eloquent? - stackoverflow
  2. Model::query - laravelAPI

原文鏈接:https://segmentfault.com/a/1190000012363492

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久精品一区 | 成人精品网站在线观看 | 国产一级一级特黄女人精品毛片 | 日本免费在线一区 | 中文字幕在线精品 | 日韩在线播 | 欧美一区二区日韩一区二区 | 91精品国产91久久久久久黑人 | 四房婷婷 | 在线观看一区二区三区四区 | 中文字幕不卡一区 | 国产免费黄色 | 九九人人 | 欧美一区二区免费在线 | 久久与欧美 | 欧美视频在线播放 | 久久综合九九 | 精品在线一区二区 | 青青草综合| 久久精品99 | 中文字幕在线视频观看 | 天天色av| 久久久999国产 | 午夜精品久久久久久久久久久久 | 久久人体视频 | 午夜影视 | 中文字幕一区二区三区精彩视频 | www.av在线播放 | a久久| 久久er99热精品一区二区 | 亚洲一区二区在线播放 | 国产高清视频在线 | 欧美综合久久 | 亚洲久草 | 午夜电影一区 | 99久久久精品国产一区二区 | 国产日韩精品一区二区 | 青青青国产精品一区二区 | 日日做| 一区二区成人网 | 日韩免费在线视频 |