在Laravel中執行數據庫操做有兩種方式,一種是使用\DB
外觀對象的靜態方法直接執行sql查詢,另一種是使用Model類的靜態方法(實際上也是Facade的實現,使用靜態訪問方式訪問Model的方法,內部採用了__callStatic
魔術方法代理了對成員方法的訪問。laravel
$results = DB::select('select * from users where id = ?', [1]); foreach ($results as $res) { echo $res->name; }
返回結果爲數組,數組中每個值爲一個StdClass
對象。sql
也可使用命名綁定,推薦使用這種方式,更加清晰一些數據庫
$results = DB::select('select * from users where id = :id', ['id' => 1]);
$users = DB::table('users')->get(); foreach ($users as $user) { var_dump($user->name); }
使用first
方法返回單行數據,該方法返回的是一個stdClass
對象json
$user = DB::table('users')->where('name', 'John')->first(); echo $user->name;
若是隻須要一列的值,則可使用value
方法直接獲取單列的值數組
$email = DB::table('users')->where('name', 'John')->value('email');
該方法用於數據表中有大量的數據的操做,每次從結果集中取出一部分,使用閉包函數進行處理,而後再處理下一部分,該命令通常用於Artisan
命令行程序中處理大量數據。閉包
DB::table('users')->chunk(100, function($users) { foreach ($users as $user) { // } });
在閉包函數中,若是返回false
,則會中止後續的處理。函數
好比咱們但願查詢出角色表中全部的title
字段值post
$titles = DB::table('roles')->pluck('title'); foreach ($titles as $title) { echo $title; }
這裏的pluck
函數有兩個參數命令行
Collection pluck( string $column, string|null $key = null)
第一個參數爲要查詢的列,第二個參數是每一列的key代理
$roles = DB::table('roles')->pluck('title', 'name'); foreach ($roles as $name => $title) { echo $title; }
查詢構造器也提供了一些彙集函數如count
,max
,min
,avg
,sum
等
$users = DB::table('users')->count(); $price = DB::table('orders')->max('price'); $price = DB::table('orders') ->where('finalized', 1) ->avg('price');
$users = DB::table('users')->select('name', 'email as user_email')->get();
若是已經指定了select,可是又但願再次添加一些字段,使用它addSelect
方法
$query = DB::table('users')->select('name'); $users = $query->addSelect('age')->get();
$users = DB::table('users')->distinct()->get();
使用DB::raw
方法能夠向查詢中注入須要的sql片斷,可是很是不推薦使用該方法,用很差會 產生sql注入
$users = DB::table('users') ->select(DB::raw('count(*) as user_count, status')) ->where('status', '<>', 1) ->groupBy('status') ->get();
使用join
執行內鏈接操做,該函數第一個參數爲要鏈接的表名,其它參數指定了鏈接約束
$users = DB::table('users') ->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id') ->select('users.*', 'contacts.phone', 'orders.price') ->get();
使用leftJoin
方法執行左鏈接操做,參數和join
同樣
$users = 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
和OrWhere
方法
DB::table('users') ->join('contacts', function ($join) { $join->on('users.id', '=', 'contacts.user_id') ->where('contacts.user_id', '>', 5); }) ->get();
要使用union操做,能夠先建立一個query,而後再使用union方法去綁定第二個query
$first = DB::table('users') ->whereNull('first_name'); $users = DB::table('users') ->whereNull('last_name') ->union($first) ->get();
一樣,unionAll
方法也是可使用的,參數與union相同。
使用where
方法爲查詢增長where條件,該函數通常須要三個參數:列名,操做符(任何數據庫支持的操做符均可以),列值。
$users = DB::table('users')->where('votes', '=', 100)->get(); $users = DB::table('users')->where('votes', 100)->get();
爲了方便起見,若是隻提供兩個參數,則默認第二個參數爲
=
,執行相等匹配。
$users = DB::table('users') ->where('votes', '>=', 100) ->get(); $users = DB::table('users') ->where('votes', '<>', 100) ->get(); $users = DB::table('users') ->where('name', 'like', 'T%') ->get();
where
條件也可使用數組提供:
$users = DB::table('users')->where([ ['status','1'], ['subscribed','<>','1'], ])->get();
若是where條件要使用or操做,則使用orWhere
方法
$users = DB::table('users') ->where('votes', '>', 100) ->orWhere('name', 'John') ->get();
$users = DB::table('users') ->whereBetween('votes', [1, 100])->get(); $users = DB::table('users') ->whereNotBetween('votes', [1, 100])->get();
$users = DB::table('users') ->whereIn('id', [1, 2, 3]) ->get(); $users = DB::table('users') ->whereNotIn('id', [1, 2, 3]) ->get();
$users = DB::table('users') ->whereNull('updated_at') ->get(); $users = DB::table('users') ->whereNotNull('updated_at') ->get();
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')
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 )
MySQL 5.7和Postgres數據庫中提供了新的數據類型json,對json提供了原生的支持,使用->
能夠對json列進行查詢。
$users = DB::table('users') ->where('options->language', 'en') ->get(); $users = DB::table('users') ->where('preferences->dining->meal', 'salad') ->get();
$users = DB::table('users') ->orderBy('name', 'desc') ->get(); $users = DB::table('users') ->groupBy('account_id') ->having('account_id', '>', 100) ->get(); $users = DB::table('orders') ->select('department', DB::raw('SUM(price) as total_sales')) ->groupBy('department') ->havingRaw('SUM(price) > 2500') ->get();
要限制查詢返回的結果行數,或者是跳過指定行數的結果(OFFSET
),可使用skip
和take
方法
$users = DB::table('users')->skip(10)->take(5)->get();
插入操做與select操做相似,使用insert
函數
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
DB::table('users')->insert( ['email' => 'john@example.com', 'votes' => 0] ); DB::table('users')->insert([ ['email' => 'taylor@example.com', 'votes' => 0], ['email' => 'dayle@example.com', 'votes' => 0] ]);
若是但願插入後可以獲取新增數據的id,則可使用insertGetId
方法
$id = DB::table('users')->insertGetId( ['email' => 'john@example.com', 'votes' => 0] );
執行DB中的update
後,會返回 操做影響的數據行數
DB::update('update users set votes = 100 where name = ?', ['John']);
DB::table('users') ->where('id', 1) ->update(['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, ['name' => 'John']);
執行DB中的delete
後,會返回 操做影響的數據行數
DB::delete('delete from users');
DB::table('users')->delete(); DB::table('users')->where('votes', '<', 100)->delete();
若是但願truncate整個表,則使用truncate
方法
DB::table('users')->truncate();
使用sharedLock
方法能夠避免選定的行在事務提交以前被修改
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
另外lockForUpdate
方法能夠避免其它的共享鎖修改或者是選定
DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
使用transaction
方法的callback函數執行事務處理
DB::transaction(function() { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
在回調函數中,拋出任何異常都會致使事務回滾
若是須要手動管理事務,則使用以下函數
DB::beginTransaction(); DB::rollback(); DB::commit();
使用DB類的靜態方法啓用的事務不只對普通sql查詢有效,對Eloquent ORM一樣有效,由於它內部也是調用了DB類的數據庫鏈接。
查看請求執行的sql日誌記錄,須要先執行enableQueryLog
開啓,而後執行getQueryLog
獲取
DB::connection()->enableQueryLog(); $queries = DB::getQueryLog();
執行通常的sql語法
DB::statement('drop table users');
監聽查找事件,能夠用來對執行的sql進行記錄
DB::listen(function($sql, $bindings, $time) { // $query->sql // $query->bindings // $query->time });
獲取某個數據庫鏈接
$users = DB::connection('foo')->select(...);
若是還不能知足需求,能夠獲取PDO對象
$pdo = DB::connection()->getPdo();
這樣無論什麼操做均可以作了吧
另外含有兩個方法,用於從新鏈接到指定數據庫和斷開鏈接
DB::reconnect('foo'); DB::disconnect('foo')d;
參考: Laravel 5.2 官方文檔