1. 程式人生 > >Laravel學習篇-資料庫操作和查詢構造器

Laravel學習篇-資料庫操作和查詢構造器

最近小編在學習號稱世界最牛框架–Laravel。其實學習框架也就是學習框架的思想! 我想在我的部落格中記錄我在laravel學習中的一些心得,歡迎大家關注我的其他Github部落格簡書,互相交流!

版本:Laravel 5.2
資料庫:mysql 5.7
php:php7.1

資料庫操作和查詢構造器

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

查詢操作

使用sql語句執行select查詢操作#

$results = DB::select('select * from users where id = ?', [1]);
foreach ($results as $res) {
    echo $res->name;
}

返回結果為陣列,陣列中每一個值為一個StdClass物件。
也可以使用命名繫結,推薦使用這種方式,更加清晰一些

$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物件

$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欄位值

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

指定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約束中要使用列值與指定陣列比較,則可以使用where和OrWhere方法

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),可以使用skip和take方法

$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' => '[email protected]', 'votes' => 0]
);
DB::table('users')->insert([
    ['email' => '[email protected]', 'votes' => 0],
    ['email' => '[email protected]', 'votes' => 0]
]);

如果希望插入後能夠獲取新增資料的id,則可以使用insertGetId方法

$id = DB::table('users')->insertGetId(
    ['email' => '[email protected]', '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');

相關推薦

Laravel學習-資料庫操作查詢構造

最近小編在學習號稱世界最牛框架–Laravel。其實學習框架也就是學習框架的思想! 我想在我的部落格中記錄我在laravel學習中的一些心得,歡迎大家關注我的其他Github部落格和簡書,互相交流! 版本:Laravel 5.2 資料庫:m

laravel之路-4 資料庫操作查詢構造

    正文之前想聊一些關於MVC的事情,接觸過很多專案,發現很多人還是很自然的把SQL寫到Ç層中,整個方法的資料庫操作完全沒有中號層什麼事,可維護性完全為0撒。試想如果有個表要改表名,改欄位名,我需要整個專案搜一下都有哪些地方用了這個表。如果產品需要監控某個表的所有操作日誌

laravel 數據庫操作查詢構造

操作 大數 avg 李冰冰 數據庫操作 排序 span var table /** * 新增數據 * / $bool = DB::table(‘wt_001‘)->insert([‘username‘=>‘冰

Laravel 操作資料庫DB facade(原始查詢) 、查詢構造、Eloquent ORM

一.DB facade連線資料庫操作檔案     config/database.php    .envDB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=roo

【TP5 :資料庫查詢構造:鏈式操作】join

join INNER JOIN: 等同於 JOIN(預設的JOIN型別),如果表中有至少一個匹配,則返回行 LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行 RIGHT JOIN: 即

thinkphp5 資料庫模型詳解 之2 查詢構造及高階技巧

1、掌握查詢構造器對於掌握資料庫和模型的查詢操作非常關鍵 2、使用查詢構造器一般都是自動例項化查詢類,Db類的任何方法都會自動呼叫connect方法返回連線物件例項,然後呼叫連線物件的查詢構造器方法會自動例項化查詢類。 3、db助手函式預設每次呼叫都會重新連線資料庫(目的是

OC學習之---KVCKVO操作

一、KVC操作OC中的KVC操作就和Java中使用反射機制去訪問類的private許可權的變數,很暴力的,這樣做就會破壞類的封裝性,本來類中的的private許可權就是不希望外界去訪問的,但是我們這樣去操作,就會反其道而行,但是我們有時候真的需要去這樣做,哎。所以說有些事不是

【TP5 :資料庫查詢構造:鏈式操作】cache

cache cache方法用於查詢快取操作,連貫操作方法 用於select、find、value和column方法,以及其衍生方法 在快取有效期之內不會再次進行資料庫查詢操作,而是直接獲取快取中的資料 //find方法使用cache方法 Db::ta

【TP5 :資料庫查詢構造:鏈式操作】時間查詢

時間查詢 時間比較 使用where方法 where方法支援時間比較 // 大於某個時間 where('create_time','> time','2016-1-1'); //

【TP5:資料庫查詢構造】鏈式操作

鏈式操作 資料庫提供的鏈式操作方法支援所有的CURD操作 使用示例: Db::table('think_user') ->where('status',1) ->order('create_time') ->l

Python學習——文件操作異常處理

not ret lease ext title eas err turn with # title = "Alice in Wonderland"# print(title.split())def count_words(filename): ‘‘‘ count ho

【深度學習】---CNNRNN結合與對比,實例講解

開頭 問答 16px 結合 觀察 反向 -c style 圖像 一、前述 CNN和RNN幾乎占據著深度學習的半壁江山,所以本文將著重講解CNN+RNN的各種組合方式,以及CNN和RNN的對比。 二、CNN與RNN對比 1、CNN卷積神經網絡與RNN遞歸神經網絡直觀圖

OC學習之--- property synthesize的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MongoDB資料庫操作Pymongo

一、MongoDB介紹 MongoDB 是一個是一個基於分散式檔案儲存的資料庫,介於關係資料庫和非關係資料庫之間,是非關係資料庫當中功能最豐富,最像關係資料庫的。他支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料型別。Mongo最大的特點是他支援的查詢語言

laravel 查詢構造 (一)

DB::table() 查詢構造器 演示 插入 insert() insert 裡面寫陣列。 返回一個布林值。 DB::table('user_ali') -> insert(['ali_us

資料結構學習之棧佇列

棧和佇列是什麼 棧和佇列是兩種特殊的線性表,它們是限定只能在表的一端或兩端進行插入、刪除元素的線性表,因此,統稱為限定性資料結構。 共同點:   都是隻能線上性表的端點插入和刪除。不同點:  棧的插入和刪除都線上性表的同一個端點,該點通稱棧頂,相應地,不能插入刪除的另一個端點通稱棧底,其特性是後進先出。

1-10.Laravel框架利用查詢構造完成CURD(二)

DB類操作資料庫 DB門面(功能類) 按照MVC 的架構,對資料的操作應該放在 Model 中完成,但如果不使用Model,我們也可以用 laravel框架提供的 DB 類操作資料庫。而且,對於某些極其複雜的sql,用Model 已經很難完成,需要開發者自己手寫sql語句

docker學習(4)--查詢、獲取映象

概述如何查詢想要的docker映象如何獲取想要的映象如何檢視拉去的本地映象如何將映象推送到docker hub網站1、查詢想要的映象1)https://hub.docker.com/ 網站進行搜尋        2)docker search  [options] 映象名稱 

laravel學習-安裝entrustl5-repository2個基本依賴

1.安裝 'l5-repository': 直接參照github文件:https://github.com/andersao/l5-repository 1>composer require prettus/l5-repository 2>vim co

laravel 查詢構造 (二)

get() //從資料表中取得所有的資料列 first() //取一條資料列 where() //寫條件 select() // 查詢部分欄位 chunk() // 分塊查詢 pluck() // 取某欄位值 lists() // 取某欄位值