# 快速入門(四):數據庫
本章我們來學習下如何使用`Db`類操作數據庫,主要包含:
- - [準備](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147279#u51C6u5907)
- [數據庫配置](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147279#u6570u636Eu5E93u914Du7F6E)
- [原生查詢](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147279#u539Fu751Fu67E5u8BE2)
- [查詢構造器](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147279#u67E5u8BE2u6784u9020u5668)
- [鏈式操作](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147279#u94FEu5F0Fu64CDu4F5C)
- [事務支持](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147279#u4E8Bu52A1u652Fu6301)
## 準備
`5.0`的數據查詢由低到高分三個層次:
1. 數據庫原生查詢(SQL查詢);
2. 數據庫鏈式查詢(查詢構造器);
3. 模型的對象化查詢;
本章會涉及到前面兩個,模型的查詢會在第六章進行講解。
在第一章已經提到,在使用`Db`類進行數據庫查詢之前,首先必須先創建一個控制器類,以及一個操作方法用于測試,類似于:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Db</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">()</span></span>{
<span class="hljs-comment">// 后面的數據庫查詢代碼都放在這個位置</span>
}
}</span>
```
```
然后,要查看數據庫執行結果的話,訪問下面的URL地址:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/</span>
```
```
## 數據庫配置
我們給應用定義數據庫配置文件(`appliation/database.php`),里面設置了應用的全局數據庫配置信息。
該數據庫配置文件的基本定義如下:
```
<pre class="calibre18">
```
<span class="hljs-keyword">return</span> [
<span class="hljs-comment">// 數據庫類型</span><span class="hljs-string">'type'</span> => <span class="hljs-string">'mysql'</span>,
<span class="hljs-comment">// 服務器地址</span><span class="hljs-string">'hostname'</span> => <span class="hljs-string">'127.0.0.1'</span>,
<span class="hljs-comment">// 數據庫名</span><span class="hljs-string">'database'</span> => <span class="hljs-string">'test'</span>,
<span class="hljs-comment">// 數據庫用戶名</span><span class="hljs-string">'username'</span> => <span class="hljs-string">'root'</span>,
<span class="hljs-comment">// 數據庫密碼</span><span class="hljs-string">'password'</span> => <span class="hljs-string">''</span>,
<span class="hljs-comment">// 數據庫連接端口</span><span class="hljs-string">'hostport'</span> => <span class="hljs-string">''</span>,
<span class="hljs-comment">// 數據庫連接參數</span><span class="hljs-string">'params'</span> => [],
<span class="hljs-comment">// 數據庫編碼默認采用utf8</span><span class="hljs-string">'charset'</span> => <span class="hljs-string">'utf8'</span>,
<span class="hljs-comment">// 數據庫表前綴</span><span class="hljs-string">'prefix'</span> => <span class="hljs-string">''</span>,
<span class="hljs-comment">// 數據庫調試模式</span><span class="hljs-string">'debug'</span> => <span class="hljs-keyword">true</span>,
];
```
```
如果你使用了多個模塊,并且不同的模塊采用不同的數據庫連接,那么可以在每個模塊的目錄下面單獨定義數據庫配置。
后面的例子,我們都采用`index`模塊的數據庫配置文件(`application/index/database.php`),配置如下(模塊數據庫配置中我們使用了長連接):
```
<pre class="calibre18">
```
<span class="hljs-keyword">return</span> [
<span class="hljs-comment">// 數據庫名</span><span class="hljs-string">'database'</span> => <span class="hljs-string">'demo'</span>,
<span class="hljs-comment">// 數據庫表前綴</span><span class="hljs-string">'prefix'</span> => <span class="hljs-string">'think_'</span>,
<span class="hljs-comment">// 數據庫連接參數</span><span class="hljs-string">'params'</span> => [
<span class="hljs-comment">// 使用長連接</span>
\PDO::ATTR_PERSISTENT => <span class="hljs-keyword">true</span>,
],
];
```
```
> #### 提示:
>
> - - - - - -
>
> 模塊的數據庫配置文件中只需要配置和全局數據庫配置文件差異的部分,相同的不需要重復配置。
也可以在調用`Db`類的時候,使用`connect`方法動態連接或者切換不同的數據庫,這個我們會在后面提到。
## 原生查詢
設置好數據庫連接信息后,我們就可以直接進行原生的SQL查詢操作了,包括`query`和`execute`兩個方法,分別用于查詢和寫入,下面我們來實現數據表`think_user`的CURD操作。
在開始之前,我們首先在數據庫`demo`中創建一個`think_data`數據表(這里以`mysql`數據庫為例),SQL代碼如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_data`</span>(
<span class="hljs-string">`id`</span> <span class="hljs-number">int</span>(<span class="hljs-number">8</span>) <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span> AUTO_INCREMENT,
<span class="hljs-string">`name`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span> <span class="hljs-keyword">COMMENT</span> <span class="hljs-string">'名稱'</span>,
<span class="hljs-string">`status`</span> tinyint(<span class="hljs-number">2</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-string">'0'</span> <span class="hljs-keyword">COMMENT</span> <span class="hljs-string">'狀態'</span>,
PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>)
) <span class="hljs-keyword">ENGINE</span>=MyISAM <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8 ;</span>
<span class="hljs-operator"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> <span class="hljs-string">`think_data`</span>(<span class="hljs-string">`id`</span>,<span class="hljs-string">`name`</span>,<span class="hljs-string">`status`</span>) <span class="hljs-keyword">VALUES</span>
(<span class="hljs-number">1</span>,<span class="hljs-string">'thinkphp'</span>,<span class="hljs-number">1</span>),
(<span class="hljs-number">2</span>,<span class="hljs-string">'onethink'</span>,<span class="hljs-number">1</span>),
(<span class="hljs-number">3</span>,<span class="hljs-string">'topthink'</span>,<span class="hljs-number">1</span>);</span>
```
```
### 創建(create)
```
<pre class="calibre18">
```
<span class="hljs-comment">// 插入記錄</span><span class="hljs-regexp">$result</span> = Db::execute(<span class="hljs-string">'insert into think_data (id, name ,status) values (5, "thinkphp",1)'</span>);
dump(<span class="hljs-regexp">$result</span>);
```
```
### 更新(update)
```
<pre class="calibre18">
```
<span class="hljs-comment">// 更新記錄</span><span class="hljs-regexp">$result</span> = Db::execute(<span class="hljs-string">'update think_data set name = "framework" where id = 5 '</span>);
dump(<span class="hljs-regexp">$result</span>);
```
```
### 讀取(read)
```
<pre class="calibre18">
```
<span class="hljs-comment">// 查詢數據</span><span class="hljs-regexp">$result</span> = Db::query(<span class="hljs-string">'select * from think_data where id = 5'</span>);
dump(<span class="hljs-regexp">$result</span>);
```
```
> query方法返回的結果是一個數據集(數組),如果沒有查詢到數據則返回空數組。
### 刪除(delete)
```
<pre class="calibre18">
```
<span class="hljs-comment">// 刪除數據</span><span class="hljs-regexp">$result</span> = Db::execute(<span class="hljs-string">'delete from think_data where id = 5 '</span>);
dump(<span class="hljs-regexp">$result</span>);
```
```
### 其它操作
可以執行一些其他的數據庫操作,原則上,讀操作都使用`query`方法,寫操作使用`execute`方法即可,例如:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 顯示數據庫列表</span><span class="hljs-regexp">$result</span> = Db::query(<span class="hljs-string">'show tables from demo'</span>);
dump(<span class="hljs-regexp">$result</span>);
<span class="hljs-comment">// 清空數據表</span><span class="hljs-regexp">$result</span> = Db::execute(<span class="hljs-string">'TRUNCATE table think_data'</span>);
dump(<span class="hljs-regexp">$result</span>);
```
```
> `query`方法用于查詢,默認情況下返回的是數據集(二維數組),`execute`方法的返回值是影響的行數。
### 切換數據庫
在進行數據庫查詢的時候,支持切換數據庫進行查詢,例如:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$result</span> = Db::connect([
<span class="hljs-comment">// 數據庫類型</span><span class="hljs-string">'type'</span> => <span class="hljs-string">'mysql'</span>,
<span class="hljs-comment">// 服務器地址</span><span class="hljs-string">'hostname'</span> => <span class="hljs-string">'127.0.0.1'</span>,
<span class="hljs-comment">// 數據庫名</span><span class="hljs-string">'database'</span> => <span class="hljs-string">'thinkphp'</span>,
<span class="hljs-comment">// 數據庫用戶名</span><span class="hljs-string">'username'</span> => <span class="hljs-string">'root'</span>,
<span class="hljs-comment">// 數據庫密碼</span><span class="hljs-string">'password'</span> => <span class="hljs-string">'123456'</span>,
<span class="hljs-comment">// 數據庫連接端口</span><span class="hljs-string">'hostport'</span> => <span class="hljs-string">''</span>,
<span class="hljs-comment">// 數據庫連接參數</span><span class="hljs-string">'params'</span> => [],
<span class="hljs-comment">// 數據庫編碼默認采用utf8</span><span class="hljs-string">'charset'</span> => <span class="hljs-string">'utf8'</span>,
<span class="hljs-comment">// 數據庫表前綴</span><span class="hljs-string">'prefix'</span> => <span class="hljs-string">'think_'</span>,
])->query(<span class="hljs-string">'select * from think_data'</span>);
dump(<span class="hljs-regexp">$result</span>);
```
```
或者采用字符串方式定義(字符串方式無法定義數據表前綴和連接參數),如下:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$result</span> = Db::<span class="hljs-keyword">connect</span>(<span class="hljs-string">'mysql://root:123456@127.0.0.1:3306/thinkphp#utf8'</span>)->query(<span class="hljs-string">'select * from think_data where id = 1'</span>);
<span class="hljs-keyword">dump</span>(<span class="hljs-regexp">$result</span>);
```
```
為了簡化代碼,通常的做法是事先在配置文件中定義好多個數據庫的連接配置,例如,我們在應用配置文件(`application/config.php`)中添加配置如下:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 數據庫配置1</span><span class="hljs-string">'db1'</span> => [
<span class="hljs-comment">// 數據庫類型</span><span class="hljs-string">'type'</span> => <span class="hljs-string">'mysql'</span>,
<span class="hljs-comment">// 服務器地址</span><span class="hljs-string">'hostname'</span> => <span class="hljs-string">'127.0.0.1'</span>,
<span class="hljs-comment">// 數據庫名</span><span class="hljs-string">'database'</span> => <span class="hljs-string">'thinkphp'</span>,
<span class="hljs-comment">// 數據庫用戶名</span><span class="hljs-string">'username'</span> => <span class="hljs-string">'root'</span>,
<span class="hljs-comment">// 數據庫密碼</span><span class="hljs-string">'password'</span> => <span class="hljs-string">'123456'</span>,
<span class="hljs-comment">// 數據庫連接端口</span><span class="hljs-string">'hostport'</span> => <span class="hljs-string">''</span>,
<span class="hljs-comment">// 數據庫連接參數</span><span class="hljs-string">'params'</span> => [],
<span class="hljs-comment">// 數據庫編碼默認采用utf8</span><span class="hljs-string">'charset'</span> => <span class="hljs-string">'utf8'</span>,
<span class="hljs-comment">// 數據庫表前綴</span><span class="hljs-string">'prefix'</span> => <span class="hljs-string">'think_'</span>,
],
<span class="hljs-comment">// 數據庫配置2</span><span class="hljs-string">'db2'</span> => [
<span class="hljs-comment">// 數據庫類型</span><span class="hljs-string">'type'</span> => <span class="hljs-string">'mysql'</span>,
<span class="hljs-comment">// 服務器地址</span><span class="hljs-string">'hostname'</span> => <span class="hljs-string">'127.0.0.1'</span>,
<span class="hljs-comment">// 數據庫名</span><span class="hljs-string">'database'</span> => <span class="hljs-string">'test'</span>,
<span class="hljs-comment">// 數據庫用戶名</span><span class="hljs-string">'username'</span> => <span class="hljs-string">'root'</span>,
<span class="hljs-comment">// 數據庫密碼</span><span class="hljs-string">'password'</span> => <span class="hljs-string">''</span>,
<span class="hljs-comment">// 數據庫連接端口</span><span class="hljs-string">'hostport'</span> => <span class="hljs-string">''</span>,
<span class="hljs-comment">// 數據庫連接參數</span><span class="hljs-string">'params'</span> => [],
<span class="hljs-comment">// 數據庫編碼默認采用utf8</span><span class="hljs-string">'charset'</span> => <span class="hljs-string">'utf8'</span>,
<span class="hljs-comment">// 數據庫表前綴</span><span class="hljs-string">'prefix'</span> => <span class="hljs-string">'test_'</span>,
],
```
```
然后就可以直接在`connect`方法中傳入配置參數進行切換數據庫連接,例如:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$result</span> = Db::connect(<span class="hljs-string">'db1'</span>)->query(<span class="hljs-string">'select * from think_data where id = 1'</span>);
<span class="hljs-regexp">$result</span> = Db::connect(<span class="hljs-string">'db2'</span>)->query(<span class="hljs-string">'select * from think_data where id = 1'</span>);
```
```
`connect`方法中的配置參數需要完整定義,并且僅僅對當此查詢有效,下次調用`Db`類的時候還是使用默認的數據庫連接。如果需要多次切換數據庫查詢,可以使用:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$db1</span> = Db::connect(<span class="hljs-string">'db1'</span>);
<span class="hljs-regexp">$db2</span> = Db::connect(<span class="hljs-string">'db2'</span>);
<span class="hljs-regexp">$db1</span>->query(<span class="hljs-string">'select * from think_data where id = 1'</span>);
<span class="hljs-regexp">$db2</span>->query(<span class="hljs-string">'select * from think_data where id = 1'</span>);
```
```
### 參數綁定
實際開發中,可能某些數據使用的是外部傳入的變量,為了讓查詢操作更加安全,我們建議使用參數綁定機制,例如上面的操作可以改為:
```
<pre class="calibre18">
```
Db::<span class="hljs-operator"><span class="hljs-keyword">execute</span>(<span class="hljs-string">'insert into think_data (id, name ,status) values (?, ?, ?)'</span>, [<span class="hljs-number">8</span>, <span class="hljs-string">'thinkphp'</span>, <span class="hljs-number">1</span>]);</span>
$result = Db::query('<span class="hljs-operator">select * <span class="hljs-keyword">from</span> think_data <span class="hljs-keyword">where</span> <span class="hljs-keyword">id</span> = ?<span class="hljs-string">', [8]);
dump($result);</span></span>
```
```
也支持命名占位符綁定,例如:
```
<pre class="calibre18">
```
Db::execute(<span class="hljs-string">'insert into think_data (id, name , status) values (:id, :name, :status)'</span>, [<span class="hljs-string">'id'</span> => <span class="hljs-number">10</span>, <span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>, <span class="hljs-string">'status'</span> => <span class="hljs-number">1</span>]);
<span class="hljs-regexp">$result</span> = Db::query(<span class="hljs-string">'select * from think_data where id=:id'</span>, [<span class="hljs-string">'id'</span> => <span class="hljs-number">10</span>]);
dump(<span class="hljs-regexp">$result</span>);
```
```
## 查詢構造器
除了原生查詢外,5.0還提供了數據庫查詢構造器,可以更方便執行數據庫操作,查詢構造器基于PDO實現,對不同的數據庫驅動都是統一的語法。
> #### 注意:
>
> - - - - - -
>
> ThinkPHP `5.0`查詢構造器使用 `PDO`參數綁定,以保護應用程序免于 `SQL`注入,因此傳入的參數不需額外轉義特殊字符。
同樣是實現上面的功能,我們可以改成:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 插入記錄</span>
Db::table(<span class="hljs-string">'think_data'</span>)
->insert([<span class="hljs-string">'id'</span> => <span class="hljs-number">18</span>, <span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>, <span class="hljs-string">'status'</span> => <span class="hljs-number">1</span>]);
<span class="hljs-comment">// 更新記錄</span>
Db::table(<span class="hljs-string">'think_data'</span>)
->where(<span class="hljs-string">'id'</span>, <span class="hljs-number">18</span>)
->update([<span class="hljs-string">'name'</span> => <span class="hljs-string">"hello"</span>]);
<span class="hljs-comment">// 查詢數據</span><span class="hljs-regexp">$list</span> = Db::table(<span class="hljs-string">'think_data'</span>)
->where(<span class="hljs-string">'id'</span>, <span class="hljs-number">18</span>)
->select();
<span class="hljs-comment">// 刪除數據</span>
Db::table(<span class="hljs-string">'think_data'</span>)
->where(<span class="hljs-string">'id'</span>, <span class="hljs-number">18</span>)
->delete();
```
```
由于我們在數據庫配置文件中設置了數據表的前綴為`think_`,因此,`table`方法可以改成`name`方法,這樣就不會因為數據表前綴的修改而改動`CURD`代碼,例如:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 插入記錄</span>
Db::name(<span class="hljs-string">'data'</span>)
->insert([<span class="hljs-string">'id'</span> => <span class="hljs-number">18</span>, <span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>]);
<span class="hljs-comment">// 更新記錄</span>
Db::name(<span class="hljs-string">'data'</span>)
->where(<span class="hljs-string">'id'</span>, <span class="hljs-number">18</span>)
->update([<span class="hljs-string">'name'</span> => <span class="hljs-string">"framework"</span>]);
<span class="hljs-comment">// 查詢數據</span><span class="hljs-regexp">$list</span> = Db::name(<span class="hljs-string">'data'</span>)
->where(<span class="hljs-string">'id'</span>, <span class="hljs-number">18</span>)
->select();
dump(<span class="hljs-regexp">$list</span>);
<span class="hljs-comment">// 刪除數據</span>
Db::name(<span class="hljs-string">'data'</span>)
->where(<span class="hljs-string">'id'</span>, <span class="hljs-number">18</span>)
->delete();
```
```
如果使用系統提供的助手函數`db`則可以進一步簡化查詢代碼如下:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$db</span> = db(<span class="hljs-string">'data'</span>);
<span class="hljs-comment">// 插入記錄</span><span class="hljs-regexp">$db</span>->insert([<span class="hljs-string">'id'</span> => <span class="hljs-number">20</span>, <span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>]);
<span class="hljs-comment">// 更新記錄</span><span class="hljs-regexp">$db</span>->where(<span class="hljs-string">'id'</span>, <span class="hljs-number">20</span>)->update([<span class="hljs-string">'name'</span> => <span class="hljs-string">"framework"</span>]);
<span class="hljs-comment">// 查詢數據</span><span class="hljs-regexp">$list</span> = <span class="hljs-regexp">$db</span>->where(<span class="hljs-string">'id'</span>, <span class="hljs-number">20</span>)->select();
dump(<span class="hljs-regexp">$list</span>);
<span class="hljs-comment">// 刪除數據</span><span class="hljs-regexp">$db</span>->where(<span class="hljs-string">'id'</span>, <span class="hljs-number">20</span>)->delete();
```
```
> `db`助手函數默認會每次重新連接數據庫,因此應當盡量避免多次調用。
關于更多的查詢條件和查詢語法,會在后面一章查詢語言中詳細講述。
## 鏈式操作
使用鏈式操作可以完成復雜的數據庫查詢操作,例如:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 查詢十個滿足條件的數據 并按照id倒序排列</span>
$list = Db::name('data')
-<span class="hljs-operator">>where(<span class="hljs-string">'status'</span>, <span class="hljs-number">1</span>)
</span> -<span class="hljs-operator">>field(<span class="hljs-string">'id,name'</span>)
</span> -<span class="hljs-operator">>order(<span class="hljs-string">'id'</span>, <span class="hljs-string">'desc'</span>)
</span> -<span class="hljs-operator">>limit(<span class="hljs-number">10</span>)
</span> -<span class="hljs-operator">>select();
</span>dump($list);
```
```
鏈式操作不分先后,只要在查詢方法(這里是`select`方法)之前調用就行,所以,下面的查詢是等效的:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 查詢十個滿足條件的數據 并按照id倒序排列</span>
$list = Db::name('data')
-<span class="hljs-operator">>field(<span class="hljs-string">'id,name'</span>)
</span> -<span class="hljs-operator">>order(<span class="hljs-string">'id'</span>, <span class="hljs-string">'desc'</span>)
</span> -<span class="hljs-operator">>where(<span class="hljs-string">'status'</span>, <span class="hljs-number">1</span>)
</span> -<span class="hljs-operator">>limit(<span class="hljs-number">10</span>)
</span> -<span class="hljs-operator">>select();
</span>dump($list);
```
```
支持鏈式操作的查詢方法包括:
方法名 描述 select 查詢數據集 find 查詢單個記錄 insert 插入記錄 update 更新記錄 delete 刪除記錄 value 查詢值 column 查詢列 chunk 分塊查詢 count等 聚合查詢> 更多的鏈式操作方法可以參考官方的完全開發手冊。
## 事務支持
> #### 注意:
>
> - - - - - -
>
> 由于需要用到事務的功能,請先修改數據表的類型為`InnoDB`,而不是`MyISAM`。
對于事務的支持,最簡單的方法就是使用`transaction`方法,只需要把需要執行的事務操作封裝到閉包里面即可自動完成事務,例如:
```
<pre class="calibre18">
```
Db::transaction(<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-number">()</span> </span>{
Db::table(<span class="hljs-string">'think_user'</span>)
->delete(<span class="hljs-number">1</span>);
Db::table(<span class="hljs-string">'think_data'</span>)
->insert([<span class="hljs-string">'id'</span> => <span class="hljs-number">28</span>, <span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>, <span class="hljs-string">'status'</span> => <span class="hljs-number">1</span>]);
});
```
```
一旦`think_data`表寫入失敗的話,系統會自動回滾,寫入成功的話系統會自動提交當前事務。
也可以手動控制事務的提交,上面的實現代碼可以改成:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 啟動事務</span>
Db::startTrans();
<span class="hljs-keyword">try</span> {
Db::table(<span class="hljs-string">'think_user'</span>)
->delete(<span class="hljs-number">1</span>);
Db::table(<span class="hljs-string">'think_data'</span>)
->insert([<span class="hljs-string">'id'</span> => <span class="hljs-number">28</span>, <span class="hljs-string">'name'</span> => <span class="hljs-string">'thinkphp'</span>, <span class="hljs-string">'status'</span> => <span class="hljs-number">1</span>]);
<span class="hljs-comment">// 提交事務</span>
Db::commit();
} <span class="hljs-keyword">catch</span> (\<span class="hljs-keyword">Exception</span> <span class="hljs-regexp">$e</span>) {
<span class="hljs-comment">// 回滾事務</span>
Db::rollback();
}
```
```
> #### 注意:
>
> - - - - - -
>
> 事務操作只對支持事務的數據庫,并且設置了數據表為事務類型才有效,在Mysql數據庫中請設置表類型為`InnoDB`。并且事務操作必須使用同一個數據庫連接。
- 脕茫隆壟脨貌脩脭
- 脕茫隆壟脨貌脩脭
- 脪祿隆壟祿霉麓隆
- 脪祿隆壟祿霉麓隆
- 露鎂隆壟URL潞脥脗路脫脡
- 露鎂隆壟URL潞脥脗路脫脡
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脣脛隆壟脢媒戮脻驢芒
- 脣脛隆壟脢媒戮脻驢芒
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脕霉隆壟脛攏脨脥潞脥鹿脴脕陋
- 攏簍1攏漏脛攏脨脥露簍脪氓
- 攏簍2攏漏祿霉麓隆虜脵脳梅
- 攏簍3攏漏露脕脠隆脝梅潞脥脨脼賂脛脝梅
- 攏簍4攏漏脌脿脨脥脳陋祿祿潞脥脳脭露爐脥錨魯脡
- 攏簍5攏漏虜茅脩爐路露脦摟
- 攏簍6攏漏脢盲脠毛潞脥脩茅脰隴
- 攏簍7攏漏鹿脴脕陋
- 攏簍8攏漏脛攏脨脥脢盲魯枚
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 戮脜隆壟API驢陋路壟
- 戮脜隆壟API驢陋路壟
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬露鎂隆壟脭脫脧卯
- Cookie
- Session
- 碌樓脭陋虜芒脢脭
- 脥錄脧帽麓婁脌鉚
- 脦脛錄鎂脡脧麓蘆
- 脩茅脰隴脗毛
- 賂陸脗錄
- A隆壟魯攏錄沒脦脢脤芒錄爐
- B隆壟3.2潞脥5.0脟酶鹵冒
- C隆壟脰煤脢脰潞爐脢媒
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝