回到最上方

文件

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

查詢產生器也提供各個不同的統計方法,像是 countmaxminavgsum

使用統計方法

$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分鐘,當結果被快取起來時,這個查詢將不會再去資料庫重新查詢,會直接透過你應用程式設定的快取驅動,載入將快取起來的結果。

討論