Laravel & Lumen 數據庫操做速查

在Laravel中執行數據庫操做有兩種方式,一種是使用\DB外觀對象的靜態方法直接執行sql查詢,另一種是使用Model類的靜態方法(實際上也是Facade的實現,使用靜態訪問方式訪問Model的方法,內部採用了__callStatic魔術方法代理了對成員方法的訪問。laravel

查詢操做

基本查詢操做

使用sql語句執行select查詢操做

$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;
}

彙集函數

查詢構造器也提供了一些彙集函數如countmaxminavgsum

$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
$price = DB::table('orders')
                ->where('finalized', 1)
                ->avg('price');

指定select查詢條件

查詢指定的列
$users = DB::table('users')->select('name', 'email as user_email')->get();

若是已經指定了select,可是又但願再次添加一些字段,使用它addSelect方法

$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
查詢不一樣的結果distinct
$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操做

內鏈接 Inner Join

使用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();

左鏈接 Left Join

使用leftJoin方法執行左鏈接操做,參數和join同樣

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

高級Join方法

若是join方法的約束條件比較複雜,可使用閉包函數的方式指定

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

若是join約束中要使用列值與指定數組比較,則可使用whereOrWhere方法

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

Union操做

要使用union操做,能夠先建立一個query,而後再使用union方法去綁定第二個query

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

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

一樣,unionAll方法也是可使用的,參數與union相同。

Where查詢條件

簡單的wehere條件

使用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();

OR條件

若是where條件要使用or操做,則使用orWhere方法

$users = DB::table('users')
     ->where('votes', '>', 100)
     ->orWhere('name', 'John')
     ->get();

其它where條件

whereBetween / whereNotBetween
$users = DB::table('users')
    ->whereBetween('votes', [1, 100])->get();
$users = DB::table('users')
    ->whereNotBetween('votes', [1, 100])->get();
whereIn / whereNotIn
$users = DB::table('users')
     ->whereIn('id', [1, 2, 3])
     ->get();
$users = DB::table('users')
     ->whereNotIn('id', [1, 2, 3])
     ->get();
whereNull / whereNotNull
$users = DB::table('users')
     ->whereNull('updated_at')
     ->get();
$users = DB::table('users')
     ->whereNotNull('updated_at')
     ->get();

高級where條件

參數組(嵌套條件)
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')
whereExists (where exist)
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
)

JSON類型的列查詢

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();

Ordering, Grouping, Limit, & Offset

$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),可使用skiptake方法

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

插入操做

使用sql語句執行插入

插入操做與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]
);

更新操做

使用sql語句執行更新操做

執行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']);

刪除操做

使用sql執行刪除

執行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 官方文檔

相關文章
相關標籤/搜索