上一節我們簡單介紹瞭如何使用查詢構建器對數據庫進行基本的增刪改查操作,這一節我們來探討如何使用查詢構建器實現一些更高級的查詢操作。
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);
顯示結果如下:
1.2 左連接
左連接的結果集指定的左表的所有行,如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均爲空值(null)。我們使用查詢構建器的leftJoin
方法進行左連接查詢:
$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get(); dd($users);
對應的輸出結果爲:
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);
輸出結果爲:
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);
輸出結果爲:
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);
輸出如下:
我們還可以使用having
方法爲分組加上條件,比如我們可以統計總瀏覽數大於500的分類:
$posts = DB::table('posts')->select('cat_id',DB::raw('SUM(views) as views'))->groupBy('cat_id')->having('views','>',500)->get(); dd($posts);
輸出結果爲:
注意:
having
中的條件字段必須出現在select
查詢字段中,否則會報錯。
6、分頁
查詢構建器中使用skip
和take
對查詢結果進行分頁,相當於SQL語句中的limit
語句:
$posts = DB::table('posts')->skip(0)->take(2)->get(); dd($posts);
對應的輸出結果爲: