在上一篇使用遷移定義好資料庫的架構後,我們還需要學習如何與資料庫互動,在 Laravel 中我們可以不必使用原生的 SQL 語法來操作資料庫,Laravel 提供一種流暢的語法來取代這些操作,比起原生語法更直覺方便和安全。
今天假設我有一資料表 users 存放使用者的資料,在使用原生 SQL 要取得所有資料時,會使用這樣的語句:
select * from `users`
而若要改使用查詢建構器取得所有資料時,Laravel 支援 DB 靜態呼叫的方法:
/* 使用查詢建構器時,需使用 DB 的名稱空間 */
use Illuminate\Support\Facades\DB;
DB::table('users')->get();
上面使用 SQL 和查詢建構器的兩種語法結果是相同的,下面會介紹許多常用的查詢建構器。
/* 只會回傳 name 和 password 兩個欄位的資料 */
DB::table('users')->select('name', 'password')->get();
/* 取得 id = 1 的資料 */
DB::table('users')->where('id', '1')->get();
/* 取得 id > 1 的資料 */
DB::table('users')->where('id', '>', '1')->get();
/* 取得 id = 1 或 name = Tom 的資料 */
DB::table('users')->where('id', '1')->orWhere('name', 'Tom')->get();
這邊要注意到如果使用多個 where() 與 orWhere() 可能會造成查詢語句上的混淆,各位可以思考看看下面這樣的查詢建構器實際上會取的怎樣的資料:
DB::table('users')->where('id', '>', '1')->orWhere('name', 'Tom')->where('password', '3456')->get();
上面的查詢建構器實際上會符合這樣的 SQL 語句:
select * from `users` where `id` > 1 or `name` = 'Tom' and `password` = '3456'
這邊會發現 where() 是使用 and 去銜接,而 orWhere() 則是使用 or,由於 and 的優先度會高於 or,在使用上務必注意此點。
/* 取得 id 2 ~ 5 的資料 */
DB::table('users')->whereBetween('id', [2, 5])->get();
/* 取得 id 不在 2 ~ 5 的資料 */
DB::table('users')->whereNotBetween('id', [2, 5])->get();
/* 取得 id = 2 和 5 的資料 */
DB::table('users')->whereIn('id', [2, 5])->get();
/* 此範例為一錯誤示範,id 為資料表的主鍵欄位,代表 id 不會有重覆值,使用 distinct() 做查詢的話會沒有結果 */
DB::table('users')->select('id')->distinct()->get();
/* 第二個參數支援 asc(升序,預設) 與 desc(降序) */
DB::table('users')->orderBy('id', 'desc')->get();
/* 由於 city 欄位中有兩組 Tatpei 資料,所以只會得到四筆資料(Jhon 和 Zorn 分為一組,所以只取得 John 的資料,再加上 James、Tom、Jack 三筆總共四筆) */
DB::table('users')->groupBy('city')->get();
/* 跳過第 1 筆取得後面頭 2 筆的資料,最常用來製作分頁 */
DB::table('users')->skip(1)->take(2)->get();
/* 回傳 John */
DB::table('users')->value('name');
/* 回傳 6 */
DB::table('users')->count();
/* 回傳 195 */
DB::table('users')->sum('age');
/* 回傳 32.5 */
DB::table('users')->avg('age');
/* 符合連結條件的資料才會顯示 */
DB::table('users')->join('contacts', 'users.id', '=', 'contacts.user_id')->get();
/* 左側資料表的所有資料會加入查詢結果,即使沒有符合連結條件的資料也會顯示 */
DB::table('users')->leftJoin('contacts', 'users.id', '=', 'contacts.user_id')->get();
DB::table('users')->insert([
['email' => 'picard@gmail.com', 'age' => 36],
['email' => 'janeway@gmail.com', 'age' => 48],
]);
DB::table('users')
->where('id', 1)
->update(['age' => 16]);
DB::table('users')->where('id', 2)->delete();
/* 取得所有用戶居住城市的分組資料 */
DB::table('users')->select(DB::raw('city, count(city) as count'))->groupBy('city')->get();