合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 快速入门(四):数据库 本章我们来学习下如何使用`Db`类操作数据库,主要包含: - - [准备](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/147279#u51C6u5907) - [数据库配置](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/147279#u6570u636Eu5E93u914Du7F6E) - [原生查询](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/147279#u539Fu751Fu67E5u8BE2) - [查询构造器](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/147279#u67E5u8BE2u6784u9020u5668) - [链式操作](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/147279#u94FEu5F0Fu64CDu4F5C) - [事务支持](http://ihavenolimitations.xyz/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`。并且事务操作必须使用同一个数据库连接。