# 基本用法
### 介绍
连接到数据库并运行查询是一个简单的过程,可以通过使用原始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)可能更有用。
- 基本说明
- 基本操作
- October cms 安装
- 后台控制器路径
- 图标
- 获取安装网上的插件/主题
- 插件构造器使用
- 定时任务
- October后台控制器
- vscode编辑器
- ajax操作
- 使用
- ajax更新组件
- ajax属性API
- JavaScript API
- ajax综合使用
- 主题
- 多语言主题
- 安装市场主题
- 主题程序处理
- 主题
- 页面
- 部件
- 布局
- 内容
- 组件
- 媒体
- 主题表单操作
- 表单使用
- 表单后端程序处理
- 插件
- 自定义插件
- 插件说明
- 插件导航条
- 插件数据库设置
- 插件的设置管理
- 插件的配置文件config
- 组件
- app服务
- app容器
- 扩展行为
- 缓存
- Collection类
- Lazy Collections
- Collection方法
- 助手函数
- 数组助手函数
- 路径助手函数
- 玄乐助手函数
- 其他助手函数
- 错误与记录
- 事件处理
- HTML页面
- 文件与目录操作
- 散列和加密
- 邮件
- 邮件内容
- 邮件发送
- 分页
- 模板解析器
- 动态解析器语法
- 队列消息
- 请求与输入
- 响应
- 视图
- 路由器
- 配置
- 验证操作
- 处理错误消息
- 错误消息与视图
- 可用的验证规则
- 有条件的验证规则
- 验证数组
- 错误消息
- 自定义验证规则
- 模型操作
- 定义模型与其属性
- 检索模型
- 插入与更新
- 删除模型
- 查询范围
- 事件操作
- 关联操作
- 定义关系
- 关系类型
- 多肽关系
- 关系查询
- 渴望加载
- 插入模型
- 数据库操作
- 基本用法
- 数据表结构
- 查询连贯操作
- 结果检索
- select子句
- 插入更新
- where子句
- 排序,分组,限制和偏移
- 文件附件
- Collection操作
- 属性操作
- 系列化json
- 数据库属性
- 数据库行为
- 控制器
- 后台控制器定义
- 后台页面
- 后台组件
- 后台表单
- 表单组件
- 表单视图
- 表单行为
- 后台列表
- 列表行为
- 列表过滤器
- 可用列类型
- 关系行为
- 关系行为类型
- 扩展关系行为
- 列表排序操作
- 导入导出操作
- 用于与权限
- corlate模板修改
- 修改顶部导航
- laravel问题
- 控制器不存在
- 控制器
- 路由组
- laravel笔记
- laravel 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图