Laravel框架學習(資料庫高階查詢)
1、連線查詢(join)
連線查詢指的是將兩張表或多張表關聯到一起進行查詢,獲取一個表的行與另一個表的行匹配的資料。常見的連線查詢包括內連線(等值連線)、左(外)連線、右(外)連線和交叉連線(完全連線)等。
我們將使用者表users和文章表posts關聯到一起進行查詢,在此之前,我們先建立posts表,其欄位及初始值如下:
其中user_id對應users表中的使用者id。
1.1 內連線
內連線用於獲取兩張表結果集的交集部分,我們可以使用查詢構建器的join方法進行內連線查詢:
$users = DB::table('users')->join('posts','users.id' ,'=','posts.user_id')->get();
dd($users);
顯示結果如下:
array:3 [▼
0 => {#226 ▼
+"id": 1
+"name": "Laravel"
+"email": "[email protected]"
+"password": "123"
+"remember_token": "x"
+"created_at": "0000-00-00 00:00:00"
+"updated_at": "0000-00-00 00:00:00"
+"title": "test1"
+"content": "test1"
+"user_id": 1
}
1 => {#227 ▼
+"id": 2
+"name": "Laravel"
+"email": "[email protected]"
+"password": "123"
+"remember_token": "x"
+"created_at": "0000-00-00 00:00:00"
+"updated_at": "0000-00-00 00:00:00"
+"title": "test2"
+"content": "test2"
+"user_id": 1
}
2 => {#228 ▼
+"id": 3
+"name": "Academy"
+"email": "[email protected]"
+"password": "123"
+"remember_token": "y"
+"created_at": "0000-00-00 00:00:00"
+"updated_at": "0000-00-00 00:00:00"
+"title": "test3"
+"content": "test3"
+"user_id": 2
}
]
1.2 左連線
左連線的結果集指定的左表的所有行,如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值(null)。我們使用查詢構建器的leftJoin方法進行左連線查詢:
$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get();
dd($users);
array:4 [▼
0 => {#226 ▶}
1 => {#227 ▶}
2 => {#228 ▶}
3 => {#229 ▼
+"id": null
+"name": "test3"
+"email": "[email protected]"
+"password": "123456"
+"remember_token": "z"
+"created_at": null
+"updated_at": null
+"title": null
+"content": null
+"user_id": null
}
]
1.3 更加複雜的連線查詢
很多時候,連線查詢的查詢條件往往更為複雜,並不是一個簡單的join/leftJoin方法就能搞定的,那麼我們如何新增更加複雜的查詢條件呢?使用JoinClause代替條件引數:
$users = DB::table('users')->join('posts',function($join){
$join->on('users.id','=','posts.user_id')
->where('posts.id','>',1);
})->get();
dd($users);
輸出結果為:
array:2 [▼
0 => {#226 ▼
+"id": 2
+"name": "Laravel"
+"email": "[email protected]"
+"password": "123"
+"remember_token": "x"
+"created_at": "0000-00-00 00:00:00"
+"updated_at": "0000-00-00 00:00:00"
+"title": "test2"
+"content": "test2"
+"user_id": 1
}
1 => {#227 ▼
+"id": 3
+"name": "Academy"
+"email": "[email protected]"
+"password": "123"
+"remember_token": "y"
+"created_at": "0000-00-00 00:00:00"
+"updated_at": "0000-00-00 00:00:00"
+"title": "test3"
+"content": "test3"
+"user_id": 2
}
]
2、聯合查詢(union)
聯合查詢用於將兩個或更多查詢的結果集組合為單個結果集,該結果集包含聯合查詢中所有查詢的全部行。UNION的結果集列名與UNION運算子中第一個Select語句的結果集的列名相同,另一個Select語句的結果集列名將被忽略,且其他查詢欄位數必須和第一個相同。Laravel查詢構建器中我們使用union方法進行聯合查詢:
$users = DB::table('users')->where('id','<',3);
$users = DB::table('users')->where('id','>',2)->union($users)->get();
dd($users);
輸出結果為:
array:3 [▼
0 => {#226 ▼
+"id": 3
+"name": "test3"
+"email": "[email protected]"
+"password": "123456"
+"remember_token": "z"
+"created_at": "2016-03-08 09:45:10"
+"updated_at": "0000-00-00 00:00:00"
}
1 => {#227 ▼
+"id": 1
+"name": "Laravel"
+"email": "[email protected]"
+"password": "123"
+"remember_token": "x"
+"created_at": "2016-03-15 09:45:03"
+"updated_at": "0000-00-00 00:00:00"
}
2 => {#228 ▼
+"id": 2
+"name": "Academy"
+"email": "[email protected]"
+"password": "123"
+"remember_token": "y"
+"created_at": "2016-03-13 09:45:07"
+"updated_at": "0000-00-00 00:00:00"
}
]
3、where子句
使用查詢構建器上的where方法可以新增自定義查詢條件,呼叫該方法需要傳入三個引數:第一個列名,第二個是操作符,第三個是比較值:
$user = DB::table('users')->where('name','=','Laravel')->get();
dd($user);
如果操作符為“=”,該語句也可簡化為:
$user = DB::table('users')->where('name','Laravel')->get();
需要注意的是查詢構建器支援方法鏈,這意味著如果有多個查詢條件且這個多個條件是AND連線,可以在get之前使用多個where方法。如果多個條件使用OR連線,可以使用orWhere方法:
$user = DB::table('users')->where('name','Laravel')->orWhere('name','Academy')->get();
更多where子句查詢條件可檢視Illuminate\Database\Query\Builder原始碼。
4、排序
查詢構建器使用orderBy方法對查詢結果進行排序:
$users = DB::table('users')->orderBy('id','desc')->get();
dd($users);
根據程式碼可以看到orderBy方法需要傳入兩個引數,第一個是排序欄位,第二個是排序方向,asc代表升序,desc代表倒序
5、分組
為了更好地演示分組,我們給資料表posts新增兩個欄位:cat_id和views,代表分類ID和瀏覽數:
分組一般用於聚合查詢,接下來我們使用groupBy方法對查詢結果進行分組,比如我們可以統計每個分類下有幾篇文章:
$posts = DB::table('posts')->select('cat_id',DB::raw('COUNT(id) as num'))->groupBy('cat_id')->get();
dd($posts);
array:2 [▼
0 => {#226 ▼
+"cat_id": 1
+"num": 2
}
1 => {#227 ▼
+"cat_id": 2
+"num": 1
}
]
我們還可以使用having方法為分組加上條件,比如我們可以統計總瀏覽數大於500的分類:
$posts = DB::table('posts')->select('cat_id',DB::raw('SUM(views) as views'))->groupBy('cat_id')->having('views','>',500)->get();
dd($posts);
輸出結果為:
array:1 [▼
0 => {#226 ▼
+"cat_id": 1
+"views": "900"
}
]
注意:having中的條件欄位必須出現在select查詢欄位中,否則會報錯。
6、分頁
查詢構建器中使用skip和take對查詢結果進行分頁,相當於SQL語句中的limit語句:
$posts = DB::table('posts')->skip(0)->take(2)->get();
dd($posts);
對應的輸出結果為:
array:2 [▼
0 => {#225 ▼
+"id": 1
+"title": "test1"
+"content": "test1"
+"user_id": 1
+"created_at": "0000-00-00 00:00:00"
+"updated_at": "0000-00-00 00:00:00"
+"cat_id": 1
+"views": 100
}
1 => {#226 ▼
+"id": 2
+"title": "test2"
+"content": "test2"
+"user_id": 1
+"created_at": "0000-00-00 00:00:00"
+"updated_at": "0000-00-00 00:00:00"
+"cat_id": 2
+"views": 500
}
]
相關推薦
Laravel框架學習(資料庫高階查詢)
1、連線查詢(join) 連線查詢指的是將兩張表或多張表關聯到一起進行查詢,獲取一個表的行與另一個表的行匹配的資料。常見的連線查詢包括內連線(等值連線)、左(外)連線、右(外)連線和交叉連線(完全連線)等。 我們將使用者表users和文章表posts關聯到一
Laravel框架學習(使用DB門面操作資料庫 原生SQL)
1、連線資料庫 Laravel中資料庫配置檔案為config/database.php,開啟該檔案,預設內容如下: <?php return [ //預設返回結果集為PHP物件例項 //具體返回結果可參考PDO.php(php P
laravel框架學習(四)執行建立中介軟體後,提示無法找到該中介軟體的解決方法
按照官方提供的文件:http://laravelacademy.org/post/7812.html 1.建立中介軟體:先宣告中介軟體, php artisan make:middleware AdminMiddleware 會自動在app/Http/Middlewar
laravel框架學習(二) 解決MySQL5.7以下資料無法遷移的方法
報錯 提示 不支援提供新的utf8字符集 第一種方法:修改字符集 修改字符集: 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 第二種方法:如果不修改字符集 修改下預設字串
laravel框架學習(一)安裝laravel,及laravel-ide-helper增強程式碼提示
1.安裝laravel框架 使用新框架composer是必須會使用的 在PHP環境下 WWW下 直接輸入以下程式碼 composer create-project --prefer-dist laravel/laravel blog "5.4.*" 回車會自動下載lar
laravel框架學習(三)win下php artisan tinker 測試資料時,無法執行報錯的解決方法
問題描述: 複製該路徑,在資源管理器的位址列中開啟,會看到 如下: Temp 往往是系統或者其他軟體生成的快取檔案或目錄 需要返回到上一級目錄Temp中,全選資料夾,刪除,提示不允許刪除的話,
laravel框架學習(一)
學習laravel 前先安裝composer 首先檢查PHP版本及相關擴充套件 PHP >= 5.5.9 OpenSSL擴充套件 PDO擴充套件 Mbstring擴充套件 - 如不滿足以上條件,請修改php.ini配置或重新編譯PHP Linu
Laravel框架學習(Request請求資料、Cookie、檔案上傳)
1、獲取Request請求資料 Laravel中一般通過控制器方法依賴注入來獲取當前請求的Request例項。 我們通過定義一個隱式控制器來進行本章節的測試。首先我們在routes.php定義路由如下: Route::controller('reque
Laravel框架學習(CSRF)
CSRF攻擊原理及其防護 1、CSRF攻擊是what? CSRF是跨站請求偽造(Cross-site request forgery)的英文縮寫。具體瞭解請自行百度。 2、Laravel中如何避免CSRF攻擊 Laravel自動為每個使用者Session
Laravel框架學習(中介軟體)
1、中介軟體簡介 Laravel中可以把HTTP中介軟體看做“裝飾器”,在請求到達最終動作之前對請求進行過濾和處理。中介軟體在Laravel中有著廣泛的應用,比如使用者認證、日誌、維護模式、開啟Session、從Session中獲取錯誤資訊,CSRF驗證,等等
Hadoop學習筆記—15.HBase框架學習(基礎知識篇)
dfs hdfs keep 負載均衡 包含 兩個 列族 文件存儲 version HBase是Apache Hadoop的數據庫,能夠對大型數據提供隨機、實時的讀寫訪問。HBase的目標是存儲並處理大型的數據。HBase是一個開源的,分布式的,多版本的,面向列的存儲模型,它
HBase框架學習(基礎知識篇)
HBase是Apache Hadoop的資料庫,能夠對大型資料提供隨機、實時的讀寫訪問。HBase的目標是儲存並處理大型的資料。HBase是一個開源的,分散式的,多版本的,面向列的儲存模型,它儲存的是鬆散型資料。 一、HBase:BigTable的開源實現 1.1 HBas
php laravel框架學習筆記 (二) 數據庫操作
true 數據 mar sql show top 一行 ati del 原博客鏈接:http://www.cnblogs.com/bitch1319453/p/6810492.html mysql基本配置 你可用通過配置環境變量,使用cmd進入mysql,當然還有一種東
hibernate框架學習之數據查詢(QBC)helloworld
string bsp eal ssi alink ger -- sim ali package cn.itcast.h3.query.hql; import java.util.List; import org.hibernate.Criteria; import o
hibernate框架學習之數據查詢(HQL)
-c skill fir 方式 行數據 del 表數據 ber 描述 lHibernate共提供5種查詢方式?OID數據查詢方式?HQL數據查詢方式?QBC數據查詢方式?本地SQL查詢方式?OGN數據查詢方式OID數據查詢方式l前提:已經獲取到了對象的OIDl查詢:基於OI
hibernate框架學習之數據查詢(HQL)helloworld
args 配置 老師 框架 sets 測試 () eat med package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Ses
SQL Server資料庫開發(3.SQL高階查詢)
一,巢狀子查詢 降低SQL語句的複雜度,提高SQL語句的可讀性 --子查詢作為條件 (where) --查詢王五前面的同學 select * from StuInfo where stuid < (select stu
框架學習(1)——service層,dao層和service實現類進行資料庫操作
最近也是比較忙,也只能忙裡偷閒地抓緊時間接著學習一下技術,自從上次學習了maven之後,越來越對框架產生了興趣,下了好多的spring視屏,聽著老師的建議,最近也萌生了看別人的程式碼進行學習的想法,然後就上了知乎搜了搜優秀的java框架,發現了一個比較感興趣的,
PythonWeb開發Django框架學習(十一)使用框架自帶Admin管理資料庫資料
上次說到了有關於Model類對於資料庫的資料的增刪改查操作還有一對多,多對多關係的對映操作等等。 這次呢來說一個django管理資料庫的網頁版幫手Admin管理,在我看來,這個和PHP的wamp整合開
PHP Laravel 框架學習筆記(一) 路由器 中介軟體 基礎使用
用了近兩年Thinkphp,嘗試接觸下Laravel框架,在寫這篇文章的時候,其實我已經陸續學習了laravel一個多月,學習期間寫了個簡單的新聞管理系統,基本熟悉laravel的使用,寫這篇文章是回顧並加深所學的知識,並更深入的瞭解框架,使用更多更有意思的