iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 26
0
Software Development

30天快速上手Laravel系列 第 26

Day26-[DB 操作] Query Builder 介紹

  • 分享至 

  • xImage
  •  

介紹

Query Builder 提供更方便的使用方式可以來操作資料庫,它可以執行應用程式中大部分的資料庫操作,且在所有支援的資料庫系統中都能作用。

Query Builder 是用 PDO 參數綁定,可以防止SQL injection 攻擊。傳入字串作為綁定前不需先清理它們。

使用方式

還記得我們之前介紹Repository時Query Builder的用法嗎? 如果忘記的話可以回去前面複習一下,底下要介紹其他的使用方式。

這邊開始用拆解的方式介紹

取得資料

table

回傳一個你指定的query builder實例,讓你繼續做後續動作。 通常後面會接其他指令。

DB::table('product');

get

回傳一個Illuminate\Support\Collection的結果,裡面包含數個PHP stdClass object (5.2之前是回傳array)

$products = DB::table('products')->get();

foreach ($products as $product) {
    echo $product->name;
}

first

回傳單一的stdClass Object

$product = DB::table('products')->where('id', '123')->first();

value

從一筆記錄中取出單一值,這個方法會直接傳回欄位的值

$price = DB::table('products')->where('id', '123')->value('price');

pluck (比較久之前的版本是用list)

從Collection 中取得每個StdClass object 中指定的值
(這個還蠻好用的)

$titles = DB::table('roles')->pluck('title', 'name');
//第二個欄位為指定的key ,可不填

foreach ($titles as $title) {
    echo $title;
}

chunk

把資料分段取出處理,如果要直接做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 使用取得資料

select

上面的方式除了pluck & value 其他都是取得table中所有的欄位,有時候其實不需要撈出這麼多資料,這時候就可以用 select

取得需要的欄位資料

//as 後面為欲顯示的別名
$products = DB::table('products')->select('price', 'name as product_name')->get();

強制查詢傳回不重複的結果

$products = DB::table('products')->distinct()->get();

分段select

如果已經有一個查詢建構器的實例,但是又希望在既存的 結果中取得一個欄位,你可使用 addSelect

$query = DB::table('products')->select('name');

$products = $query->addSelect('price')->get();

排序

orderBy

依什麼條件排序,支援asc(升序) 與desc(降序)
(很簡單,但是很常用到,尤其在做表單讓使用者看資料)

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

latest / oldest / inRandomOrder

//取得最新/舊(oldest)的資料,預設是依照created_at 排序,也可以填入想排序的欄位
$product = DB::table('products')->latest()->first();

//隨機排序
$randomProduct = DB::table('products')->inRandomOrder()->first();

group by / having

可以把結果分組

$products = DB::table('products')
                ->groupBy('date', 'status')
                ->having('price', '>', 100)
                ->get();

skip / take

略過(偏移)給定數量/限制查詢回傳數量 的結果

$products = DB::table('products')->skip(10)->take(5)->get();

還有其他的方法會在下一章做介紹


上一篇
Day25-[DB 操作] DB 簡介
下一篇
Day27-[DB 操作] Query Builder More
系列文
30天快速上手Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言