1. 程式人生 > >Laravel 資料庫例項教程 —— 使用查詢構建器實現對資料庫的高階查詢 阿星小棧...

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

對應的輸出結果為:

分頁查詢結果集