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);
顯示結果如下:
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語句的結果集列名將被忽略,且其他查詢欄位數必須和第一個相同。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);
對應的輸出結果為: