多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 基本用法 ### 介绍 连接到数据库并运行查询是一个简单的过程,可以通过使用原始SQL,[查询构建器](https://octobercms.com/docs/database/query)或[活动记录模型来支持](https://octobercms.com/docs/database/model)。管理数据库表和填充种子数据由[迁移和种子程序处理](https://octobercms.com/docs/database/structure)。 原始SQL和使用查询生成器的执行速度更快,应用于简单任务。Active Record是流行的框架Ruby On Rails使用的一种方法。它提供了一个简单的界面来执行重复的任务,例如创建,读取,更新和删除数据库记录。您可以[在Wikipedia上](http://en.wikipedia.org/wiki/Active_record_pattern)了解有关[活动记录模式的](http://en.wikipedia.org/wiki/Active_record_pattern)更多信息。 ### [](https://octobercms.com/docs/database/basics#configuration)组态 您的应用程序的数据库配置位于该`config/database.php`文件中。在此文件中,您可以定义所有数据库连接,并指定默认情况下应使用哪个连接。此文件中提供了所有受支持的数据库系统的示例。 ### [](https://octobercms.com/docs/database/basics#read-write-connections)读/写连接 有时,您可能希望对SELECT语句使用一个数据库连接,而对INSERT,UPDATE和DELETE语句使用另一个数据库连接。无论使用原始查询,查询生成器还是模型,都可以轻松指定使用哪个连接。 要查看应如何配置读/写连接,让我们看下面的示例: ~~~ 'mysql' => [ 'read' => [ 'host' => '192.168.1.1', ], 'write' => [ 'host' => '196.168.1.2' ], 'driver' => 'mysql', 'database' => 'database', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ], ~~~ 请注意,两个键已添加到配置数组:`read`和`write`。这两个键的数组值都包含一个键:`host`。`read`和`write`连接的其余数据库选项将从主`mysql`阵列合并。 如果我们希望覆盖主数组中的值,则只需要在`read`和`write`数组中放置项目即可。因此,在这种情况下,`192.168.1.1`将用作“读取”连接,而`192.168.1.2`将用作“写入”连接。主`mysql`阵列中的数据库凭据,前缀,字符集和所有其他选项将在两个连接之间共享。 ### [](https://octobercms.com/docs/database/basics#running-queries)运行原始SQL查询 一旦配置了数据库连接,就可以使用`Db`Facade运行查询。的`Db`立面提供了每种类型的查询方法:`select`,`update`,`insert`,`delete`,和`statement`。 #### 运行选择查询 要运行基本查询,我们可以`select`在`Db`外观上使用方法: ~~~ $users = Db::select('select * from users where active = ?', [1]); ~~~ 传递给该`select`方法的第一个参数是原始SQL查询,而第二个参数是需要绑定到查询的任何参数绑定。通常,这些是`where`子句约束的值。参数绑定可防止SQL注入。 该`select`方法将始终返回`array`结果。数组中的每个结果将是一个PHP`stdClass`对象,使您可以访问结果的值: ~~~ foreach ($users as $user) { echo $user->name; } ~~~ #### 使用命名绑定 `?`您可以使用命名绑定执行查询,而不是用来表示参数绑定: ~~~ $results = Db::select('select * from users where id = :id', ['id' => 1]); ~~~ #### 运行插入语句 要执行`insert`语句,可以`insert`在`Db`外观上使用方法。像一样`select`,此方法将原始SQL查询作为其第一个参数,并将绑定作为第二个参数: ~~~ Db::insert('insert into users (id, name) values (?, ?)', [1, 'Joe']); ~~~ #### 运行更新语句 该`update`方法应用于更新数据库中的现有记录。受该语句影响的行数将由方法返回: ~~~ $affected = Db::update('update users set votes = 100 where name = ?', ['John']); ~~~ #### 运行删除语句 该`delete`方法应用于从数据库中删除记录。与一样`update`,将返回删除的行数: ~~~ $deleted = Db::delete('delete from users'); ~~~ #### 运行一般性声明 某些数据库语句不应返回任何值。对于这些类型的操作,您可以`statement`在`Db`外观上使用方法: ~~~ Db::statement('drop table users'); ~~~ ### [](https://octobercms.com/docs/database/basics#accessing-connections)多个数据库连接 使用多个连接时,可以通过立面上的`connection`方法访问每个连接`Db`。在`name`传递给`connection`方法应该对应于您列出的其中一个连接`config/database.php`配置文件: ~~~ $users = Db::connection('foo')->select(...); ~~~ 您还可以使用`getPdo`连接实例上的方法访问原始的基础PDO实例: ~~~ $pdo = Db::connection()->getPdo(); ~~~ ### [](https://octobercms.com/docs/database/basics#database-transactions)数据库交易 要在数据库事务中运行一组操作,可以`transaction`在`Db`外观上使用该方法。如果在事务内引发异常`Closure`,则事务将自动回滚。如果`Closure`执行成功,事务将自动提交。您无需担心使用该`transaction`方法时手动回滚或提交: ~~~ Db::transaction(function () { Db::table('users')->update(['votes' => 1]); Db::table('posts')->delete(); }); ~~~ #### 手动使用交易 如果您想手动开始事务并完全控制回滚和提交,则可以`beginTransaction`在`Db`外观上使用该方法: ~~~ Db::beginTransaction(); ~~~ 您可以通过以下`rollBack`方法回滚事务: ~~~ Db::rollBack(); ~~~ 最后,您可以通过以下`commit`方法提交交易: ~~~ Db::commit(); ~~~ > **注意:**使用`Db`Facade的事务方法还可以控制[查询构建器](https://octobercms.com/docs/database/query)和[模型查询的](https://octobercms.com/docs/database/model)事务。 ### [](https://octobercms.com/docs/database/basics#database-events)数据库事件 如果您希望接收应用程序执行的每个SQL查询,则可以使用该`listen`方法。此方法对于记录查询或调试很有用。 ~~~ Db::listen(function($sql, $bindings, $time) { // }); ~~~ 就像[事件注册一样](https://octobercms.com/docs/services/events#event-registration),您可以`boot`使用[插件注册文件](https://octobercms.com/docs/plugin/registration#registration-methods)的方法注册查询侦听器。另外,插件可以在插件目录中提供一个名为**init.php**的文件,您可以使用该文件放置此逻辑。 ### [](https://octobercms.com/docs/database/basics#query-logging)查询记录 启用查询日志记录后,日志将保留在针对当前请求运行的所有查询的内存中。调用该`enableQueryLog`方法以启用此功能。 ~~~ Db::connection()->enableQueryLog(); ~~~ 要获取已执行查询的数组,可以使用以下`getQueryLog`方法: ~~~ $queries = Db::getQueryLog(); ~~~ 但是,在某些情况下,例如在插入大量行时,这可能导致应用程序使用过多的内存。要禁用日志,可以使用以下`disableQueryLog`方法: ~~~ Db::connection()->disableQueryLog(); ~~~ > **注意**:为了更快地进行调试,相反,调用`trace_sql`[helper函数](https://octobercms.com/docs/services/error-log#helpers)可能更有用。