Query Builder 提供更方便的使用方式可以來操作資料庫,它可以執行應用程式中大部分的資料庫操作,且在所有支援的資料庫系統中都能作用。
Query Builder 是用 PDO 參數綁定,可以防止SQL injection 攻擊。傳入字串作為綁定前不需先清理它們。
還記得我們之前介紹Repository時Query Builder的用法嗎? 如果忘記的話可以回去前面複習一下,底下要介紹其他的使用方式。
這邊開始用拆解的方式介紹
回傳一個你指定的query builder實例,讓你繼續做後續動作。 通常後面會接其他指令。
DB::table('product');
回傳一個Illuminate\Support\Collection的結果,裡面包含數個PHP stdClass object (5.2之前是回傳array)
$products = DB::table('products')->get();
foreach ($products as $product) {
echo $product->name;
}
回傳單一的stdClass Object
$product = DB::table('products')->where('id', '123')->first();
從一筆記錄中取出單一值,這個方法會直接傳回欄位的值
$price = DB::table('products')->where('id', '123')->value('price');
從Collection 中取得每個StdClass object 中指定的值
(這個還蠻好用的)
$titles = DB::table('roles')->pluck('title', 'name');
//第二個欄位為指定的key ,可不填
foreach ($titles as $title) {
echo $title;
}
把資料分段取出處理,如果要直接做update的話還可以用 chunkById
(當資料量很大卻都要取出處理時好用)
如果有在chunk做update/delete資料的動作時要小心primary key 或 foreign keys,如果有動到會影響chunk的資料
DB::table('products')->chunk(100, function($products) {
foreach ($products as $product) {
// do something
}
//return false; 可以用return false 中斷
});
接著會開始配合上面提到的 method 使用取得資料
上面的方式除了pluck & value 其他都是取得table中所有的欄位,有時候其實不需要撈出這麼多資料,這時候就可以用 select
//as 後面為欲顯示的別名
$products = DB::table('products')->select('price', 'name as product_name')->get();
$products = DB::table('products')->distinct()->get();
如果已經有一個查詢建構器的實例,但是又希望在既存的 結果中取得一個欄位,你可使用 addSelect
$query = DB::table('products')->select('name');
$products = $query->addSelect('price')->get();
依什麼條件排序,支援asc(升序) 與desc(降序)
(很簡單,但是很常用到,尤其在做表單讓使用者看資料)
$products = DB::table('products')
->orderBy('id', 'desc')
->get();
//取得最新/舊(oldest)的資料,預設是依照created_at 排序,也可以填入想排序的欄位
$product = DB::table('products')->latest()->first();
//隨機排序
$randomProduct = DB::table('products')->inRandomOrder()->first();
可以把結果分組
$products = DB::table('products')
->groupBy('date', 'status')
->having('price', '>', 100)
->get();
略過(偏移)給定數量/限制查詢回傳數量 的結果
$products = DB::table('products')->skip(10)->take(5)->get();
還有其他的方法會在下一章做介紹