鍍金池/ 教程/ PHP/ 查詢構(gòu)造器
Laravel Cashier
Eloquent ORM
HTTP 響應(yīng)
發(fā)行說明
擴(kuò)展包開發(fā)
HTTP 控制器
事件
擴(kuò)展框架
Contracts
開發(fā)
配置
表單驗證
錯誤與日志
Hashing
貢獻(xiàn)指南
郵件
Session
遷移與數(shù)據(jù)填充
查詢構(gòu)造器
Redis
升級向?qū)?/span>
概覽
緩存
服務(wù)提供者
Envoy 任務(wù)執(zhí)行器
隊列
單元測試
服務(wù)容器
文件系統(tǒng) / 云存儲
認(rèn)證
請求的生命周期
加密
模板
視圖 (View)
Laravel Homestead
Laravel 安裝指南
介紹
Command Bus
分頁
輔助方法
應(yīng)用程序結(jié)構(gòu)
HTTP 路由
HTTP 請求
基本用法
本地化
HTTP 中間件
結(jié)構(gòu)生成器
Facades
Laravel Elixir

查詢構(gòu)造器

介紹

數(shù)據(jù)庫查詢構(gòu)造器 (query builder) 提供方便、流暢的接口,用來建立及執(zhí)行數(shù)據(jù)庫查找語法。在你的應(yīng)用程序里面,它可以被使用在大部分的數(shù)據(jù)庫操作,而且它在所有支持的數(shù)據(jù)庫系統(tǒng)上都可以執(zhí)行。

注意: Laravel 查詢構(gòu)造器使用 PDO 參數(shù)綁定,以保護(hù)應(yīng)用程序免于 SQL 注入,因此傳入的參數(shù)不需額外轉(zhuǎn)義特殊字符。

Selects

從數(shù)據(jù)表中取得所有的數(shù)據(jù)列

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

foreach ($users as $user)
{
    var_dump($user->name);
}

從數(shù)據(jù)表中分塊查找數(shù)據(jù)列

DB::table('users')->chunk(100, function($users)
{
    foreach ($users as $user)
    {
        //
    }
});

通過在 閉包 中返回 false 來停止處理接下來的數(shù)據(jù)列:

DB::table('users')->chunk(100, function($users)
{
    //

    return false;
});

從數(shù)據(jù)表中取得單一數(shù)據(jù)列

$user = DB::table('users')->where('name', 'John')->first();

var_dump($user->name);

從數(shù)據(jù)表中取得單一數(shù)據(jù)列的單一字段

$name = DB::table('users')->where('name', 'John')->pluck('name');

取得單一字段值的列表

$roles = DB::table('roles')->lists('title');

這個方法將會返回數(shù)據(jù)表 role 的 title 字段值的數(shù)組。你也可以通過下面的方法,為返回的數(shù)組指定自定義鍵值。

$roles = DB::table('roles')->lists('title', 'name');

指定查詢子句 (Select Clause)

$users = DB::table('users')->select('name', 'email')->get();

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

$users = DB::table('users')->select('name as user_name')->get();

增加查詢子句到現(xiàn)有的查詢中

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

$users = $query->addSelect('age')->get();

使用 where 及運(yùn)算符

$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 Not Between

$users = DB::table('users')
                    ->whereNotBetween('votes', array(1, 100))->get();

使用 Where In 與數(shù)組

$users = DB::table('users')
                    ->whereIn('id', array(1, 2, 3))->get();

$users = DB::table('users')
                    ->whereNotIn('id', array(1, 2, 3))->get();

使用 Where Null 找有未配置的值的數(shù)據(jù)

$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

查詢構(gòu)造器也可以使用 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')
            ->get();

Left Join 語法

DB::table('users')
        ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
        ->get();

你也可以指定更高級的 join 子句:

DB::table('users')
        ->join('contacts', function($join)
        {
            $join->on('users.id', '=', 'contacts.user_id')->orOn(...);
        })
        ->get();

如果你想在你的 join 中使用 where 型式的子句,你可以在 join 子句里使用 whereorWhere 方法。下面的方法將會比較 contacts 數(shù)據(jù)表中的 user_id 的數(shù)值,而不是比較兩個字段。

DB::table('users')
        ->join('contacts', function($join)
        {
            $join->on('users.id', '=', 'contacts.user_id')
                 ->where('contacts.user_id', '>', 5);
        })
        ->get();

高級 Wheres

群組化參數(shù)

有些時候你需要更高級的 where 子句,如「where exists」或嵌套的群組化參數(shù)。Laravel 的查詢構(gòu)造器也可以處理這樣的情況:

DB::table('users')
            ->where('name', '=', 'John')
            ->orWhere(function($query)
            {
                $query->where('votes', '>', 100)
                      ->where('title', '<>', 'Admin');
            })
            ->get();

上面的查找語法會產(chǎn)生下方的 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();

上面的查找語法會產(chǎn)生下方的 SQL:

select * from users
where exists (
    select 1 from orders where orders.user_id = users.id
)

聚合

查找產(chǎn)生器也提供各式各樣的聚合方法,如 count、max、min、avgsum。

使用聚合方法

$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');

原生表達(dá)式

有些時候你需要使用原生表達(dá)式在查找語句里,這樣的表達(dá)式會成為字串插入至查找,因此要小心勿建立任何 SQL 注入點(diǎn)。要建立原生表達(dá)式,你可以使用 DB::raw 方法:

使用原生表達(dá)式

$users = DB::table('users')
                     ->select(DB::raw('count(*) as user_count, status'))
                     ->where('status', '<>', 1)
                     ->groupBy('status')
                     ->get();

添加

添加數(shù)據(jù)進(jìn)數(shù)據(jù)表

DB::table('users')->insert(
    array('email' => 'john@example.com', 'votes' => 0)
);

添加自動遞增 (Auto-Incrementing) ID 的數(shù)據(jù)至數(shù)據(jù)表

如果數(shù)據(jù)表有自動遞增的 ID,可以使用 insertGetId 添加數(shù)據(jù)并返回該 ID:

$id = DB::table('users')->insertGetId(
    array('email' => 'john@example.com', 'votes' => 0)
);

注意: 當(dāng)使用 PostgreSQL 時,insertGetId 方法會預(yù)期自動增加的字段是以「id」為命名。

添加多個數(shù)據(jù)進(jìn)數(shù)據(jù)表

DB::table('users')->insert(array(
    array('email' => 'taylor@example.com', 'votes' => 0),
    array('email' => 'dayle@example.com', 'votes' => 0),
));

更新

更新數(shù)據(jù)表中的數(shù)據(jù)

DB::table('users')
            ->where('id', 1)
            ->update(array('votes' => 1));

自增或自減一個字段的值

DB::table('users')->increment('votes');

DB::table('users')->increment('votes', 5);

DB::table('users')->decrement('votes');

DB::table('users')->decrement('votes', 5);

也能夠同時指定其他要更新的字段:

DB::table('users')->increment('votes', 1, array('name' => 'John'));

刪除

刪除數(shù)據(jù)表中的數(shù)據(jù)

DB::table('users')->where('votes', '<', 100)->delete();

刪除數(shù)據(jù)表中的所有數(shù)據(jù)

DB::table('users')->delete();

清空數(shù)據(jù)表

DB::table('users')->truncate();

Unions

查詢構(gòu)造器也提供一個快速的方法去「合并 (union)」兩個查找的結(jié)果:

$first = DB::table('users')->whereNull('first_name');

$users = DB::table('users')->whereNull('last_name')->union($first)->get();

unionAll 方法也可以使用,它與 union 方法的使用方式一樣。

悲觀鎖定

查詢構(gòu)造器提供了少數(shù)函數(shù)協(xié)助你在 SELECT 語句中做到「悲觀鎖定」。

想要在 SELECT 語句中加上「Shard lock」,只要在查找語句中使用 sharedLock 函數(shù):

DB::table('users')->where('votes', '>', 100)->sharedLock()->get();

要在 select 語法中使用「鎖住更新(lock for update)」時,你可以使用 lockForUpdate 方法:

DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();