Query產生器
介紹
資料庫查詢產生器提供一個方便流暢的介面,去建立並執行資料庫的查詢,他可以產生資料庫大部分的查詢語法,並且支援所有 Laravel 支援的資料庫系統。
注意: Laravel 查詢產生器使用 PDO 參數綁定,保護你的應用程式部會受到 SQL Injection攻擊,所以說在傳遞參數到查詢產生器時,你不需要對字串進行過濾。
Selects
從資料表取得所有資料列
$users = DB::table('users')->get();
foreach ($users as $user)
{
var_dump($user->name);
}
從資料表取得單一資料列
$user = DB::table('users')->where('name', 'John')->first();
var_dump($user->name);
從資料表取得單一資料列的資料欄位
$name = DB::table('users')->where('name', 'John')->pluck('name');
取得資料表欄位值的清單
$roles = DB::table('roles')->lists('title');
這個方法將會回傳欄位 title 值的組合陣列,你也可以自訂回傳的陣列 key 名稱:
$roles = DB::table('roles')->lists('title', 'name');
指定 SELECT 欄位
$users = DB::table('users')->select('name', 'email')->get();
$users = DB::table('users')->distinct()->get();
$users = DB::table('users')->select('name as user_name')->get();
再以存在的查詢加入 SELECT 的欄位
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
使用 WHERE 的語句
$users = DB::table('users')->where('votes', '>', 100)->get();
使用 OR 的語句
$users = DB::table('users')
->where('votes', '>', 100)
->orWhere('name', 'John')
->get();
使用 WHERE Between 的語句
$users = DB::table('users')
->whereBetween('votes', array(1, 100))->get();
使用 WHERE IN 的語句,並指定 IN 陣列值
$users = DB::table('users')
->whereIn('id', array(1, 2, 3))->get();
$users = DB::table('users')
->whereNotIn('id', array(1, 2, 3))->get();
使用 WHERE NULL 的語句,去找到還沒設定值的紀錄
$users = DB::table('users')
->whereNull('updated_at')->get();
Order By 、 Group By 及 Having
$users = DB::table('users')
->orderBy('name', 'desc')
->groupBy('count')
->having('count', '>', 100)
->get();
Offset & Limit
$users = DB::table('users')->skip(10)->take(5)->get();
Joins
查詢產生器也可以使用 join 語句,可以看看下列的使用範例:
基本 Join 語句
DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.id', 'contacts.phone', 'orders.price');
你也可以指定更多進階的 join 條件:
DB::table('users')
->join('contacts', function($join)
{
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
})
->get();
進階Wheres
有時你或許需要建立更多進階的 WHERE 條件,像是 "WHERE EXISTS" 或者巢狀的參數群組,Laravel 的查詢產生器也可以將這些查詢條件處理得很好:
參數群組
DB::table('users')
->where('name', '=', 'John')
->orWhere(function($query)
{
$query->where('votes', '>', 100)
->where('title', '<>', 'Admin');
})
->get();
上列的查詢會產生下列的 SQL 語法:
select * from users where name = 'John' or (votes > 100 and title <> 'Admin')
EXISTS 語句
DB::table('users')
->whereExists(function($query)
{
$query->select(DB::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();
上列的查詢會產生下列的 SQL 語法:
select * from users
where exists (
select 1 from orders where orders.user_id = users.id
)
Aggregates
查詢產生器也提供各個不同的統計方法,像是 count
、 max
、 min
、 avg
及 sum
。
使用統計方法
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
$price = DB::table('orders')->min('price');
$price = DB::table('orders')->avg('price');
$total = DB::table('users')->sum('votes');
原始表達式
有時,你可能需要使用原始的查詢表達式,這種表達式需要直接插入最終的sql語句中,所以,請特別注意防範sql注入!使用DB::raw方法實現原始查詢表達式:
有時你可能需要在查詢中使用原始的 SQL 語句,你可以使用 DB::raw
方法去達到這樣的查詢需求,這個原始 SQL 語句將會被被當作字串連接在產生的 SQL 語法當中,所以必須注意不要讓程式產生 SQL Injecttion 的情況發生:
使用原始的查詢表達式
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
欄位的遞增或遞減值
DB::table('users')->increment('votes');
DB::table('users')->decrement('votes');
新增
新增一筆紀錄
DB::table('users')->insert(
array('email' => 'john@example.com', 'votes' => 0)
);
假如資料表有自動增加的編號欄位,可以使用 insertGetId
方法去新增一筆紀錄,並取得其新增的編號值:
新增帶有自訂增加編號的紀錄
$id = DB::table('users')->insertGetId(
array('email' => 'john@example.com', 'votes' => 0)
);
注意: 當使用 PostgreSQL 資料庫時,insertGetId 會預設將自動增加的欄位名稱命名為 "id"。
新增多筆記錄
DB::table('users')->insert(array(
array('email' => 'taylor@example.com', 'votes' => 0),
array('email' => 'dayle@example.com', 'votes' => 0),
));
更新
更新資料表的紀錄
DB::table('users')
->where('id', 1)
->update(array('votes' => 1));
刪除
刪除紀錄
DB::table('users')->where('votes', '<', 100)->delete();
刪除資料表所有紀錄
DB::table('users')->delete();
清空資料表
DB::table('users')->truncate();
聯集
查詢產生器也提供快速的方法去 "聯集 ("union")" 兩個查詢結果:
執行查詢聯集
$first = DB::table('users')->whereNull('first_name');
$users = DB::table('users')->whereNull('last_name')->union($first)->get();
也可以使用 unionAll
方法,也有一些其他有 union
特徵的方法。
快取查詢
使用 remember
方法時,你可以很容易的將查詢結果記錄到快取中:
快取查詢結果
$users = DB::table('users')->remember(10)->get();
在這個範例,查詢結果將會被快取10分鐘,當結果被快取起來時,這個查詢將不會再去資料庫重新查詢,會直接透過你應用程式設定的快取驅動,載入將快取起來的結果。