Laravel 數據庫實例教程 —— 使用查詢構建器實現對數據庫的高級查詢

上一節我們簡單介紹瞭如何使用查詢構建器數據庫進行基本的增刪改查操作,這一節我們來探討如何使用查詢構建器實現一些更高級的查詢操作。

1、連接查詢(join

連接查詢指的是將兩張表或多張表關聯到一起進行查詢,獲取一個表的行與另一個表的行匹配的數據。常見的連接查詢包括內連接(等值連接)、左(外)連接、右(外)連接和交叉連接(完全連接)等。下面這張圖形象的展示了這幾種連接查詢所獲取的結果集:

SQL連接查詢

下面我們簡單演示下內連接和左連接。我們將用戶表users和文章表posts關聯到一起進行查詢,在此之前,我們先創建posts表,其字段及初始值如下:

文章表posts

其中user_id對應users表中的用戶id。

1.1 內連接

內連接用於獲取兩張表結果集的交集部分,我們可以使用查詢構建器的join方法進行內連接查詢:

$users = DB::table('users')->join('posts','users.id','=','posts.user_id')->get();
dd($users);

顯示結果如下:

inner join 查詢結果

1.2 左連接

左連接的結果集指定的左表的所有行,如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均爲空值(null)。我們使用查詢構建器的leftJoin方法進行左連接查詢:

$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get();
dd($users);

對應的輸出結果爲:

left join 查詢結果

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();

輸出結果爲:

where查詢結果集

需要注意的是查詢構建器支持方法鏈,這意味着如果有多個查詢條件且這個多個條件是AND連接,可以在get之前使用多個where方法。如果多個條件使用OR連接,可以使用orWhere方法:

$user = DB::table('users')->where('name','Laravel')->orWhere('name','Academy')->get();

對應輸出爲:

orWhere查詢結果集

更多where子句查詢條件可查看Illuminate\Database\Query\Builder源碼。

4、排序

查詢構建器使用orderBy方法對查詢結果進行排序:

$users = DB::table('users')->orderBy('id','desc')->get();
dd($users);

根據代碼可以看到orderBy方法需要傳入兩個參數,第一個是排序字段,第二個是排序方向,asc代表升序,desc代表倒序,上述代碼輸出爲:

orderBy查詢結果集

5、分組

爲了更好地演示分組,我們給數據表posts新增兩個字段:cat_idviews,代表分類ID和瀏覽數:

posts表新增分類ID和瀏覽數

分組一般用於聚合查詢,接下來我們使用groupBy方法對查詢結果進行分組,比如我們可以統計每個分類下有幾篇文章:

$posts = DB::table('posts')->select('cat_id',DB::raw('COUNT(id) as num'))->groupBy('cat_id')->get();
dd($posts);

輸出如下:

groupBy查詢結果集

我們還可以使用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、分頁

查詢構建器中使用skiptake對查詢結果進行分頁,相當於SQL語句中的limit語句:

$posts = DB::table('posts')->skip(0)->take(2)->get();
dd($posts);

對應的輸出結果爲:

分頁查詢結果集

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章