# 查询连贯操作
### 介绍
数据库查询构建器为创建和运行数据库查询提供了方便,流畅的界面。它可用于在应用程序中执行大多数数据库操作,并且可在所有受支持的数据库系统上工作。
> **注意:**查询构建器使用PDO参数绑定来保护您的应用程序免受SQL注入攻击。无需清除作为绑定传递的字符串。
### [](https://octobercms.com/docs/database/query#joins)添加
#### 内部加入声明
查询构建器还可以用于编写连接语句。要执行基本的SQL“内部联接”,可以`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();
~~~
#### 左联接/右联接语句
如果要执行“左连接”或“右连接”而不是“内部连接”,请使用`leftJoin`或`rightJoin`方法。该`leftJoin`和`rightJoin`方法具有相同签名的`join`方法:
~~~
$users = Db::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
$users = Db::table('users')
->rightJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
~~~
#### 交叉加入声明
要执行“交叉连接”,请使用`crossJoin`要交叉连接到的表的名称的方法。交叉联接在第一个表和联接的表之间生成笛卡尔乘积:
~~~
$users = Db::table('sizes')
->crossJoin('colors')
->get();
~~~
#### 高级联接语句
您也可以指定更高级的连接子句。首先,将a`Closure`作为第二个参数传递给`join`方法。该`Closure`会收到一个`JoinClause`对象,它允许你指定的约束`join`条款:
~~~
Db::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
})
->get();
~~~
如果要在联接上使用“ where”样式子句,则可以在联接上使用`where`和`orWhere`方法。这些方法将比较列和一个值,而不是比较两个列:
~~~
Db::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})
->get();
~~~
#### 子查询联接
您可以使用`joinSub`,`leftJoinSub`和`rightJoinSub`方法加入查询的子查询。这些方法中的每一个都接收三个参数:子查询,其表别名和定义相关列的Closure:
~~~
$latestPosts = Db::table('posts')
->select('user_id', Db::raw('MAX(created_at) as last_post_created_at'))
->where('is_published', true)
->groupBy('user_id');
$users = Db::table('users')
->joinSub($latestPosts, 'latest_posts', function ($join) {
$join->on('users.id', '=', 'latest_posts.user_id');
})->get();
~~~
### [](https://octobercms.com/docs/database/query#unions)工会
查询构建器还提供了一种将两个查询“联合”在一起的快速方法。例如,您可以创建一个初始查询,然后使用该`union`方法将其与第二个查询合并:
~~~
$first = Db::table('users')
->whereNull('first_name');
$users = Db::table('users')
->whereNull('last_name')
->union($first)
->get();
~~~
该`unionAll`方法也可用,并且具有与相同的方法签名`union`。
### [](https://octobercms.com/docs/database/query#deletes)删除内容
查询构建器还可用于通过以下`delete`方法从表中删除记录:
~~~
Db::table('users')->delete();
~~~
您可以`delete`通过`where`在调用`delete`方法之前添加子句来约束语句:
~~~
Db::table('users')->where('votes', '<', 100)->delete();
~~~
如果您希望截断整个表,这将删除所有行并将自动递增ID重置为零,则可以使用以下`truncate`方法:
~~~
Db::table('users')->truncate();
~~~
### [](https://octobercms.com/docs/database/query#pessimistic-locking)悲观锁定
查询构建器还包括一些函数来帮助您对`select`语句执行“悲观锁定”。要使用“共享锁”运行语句,可以`sharedLock`在查询中使用该方法。共享锁可防止在事务提交之前修改选定的行:
~~~
Db::table('users')->where('votes', '>', 100)->sharedLock()->get();
~~~
或者,您可以使用该`lockForUpdate`方法。“用于更新”锁可防止修改行或使用另一个共享锁选择行:
~~~
Db::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
~~~
### [](https://octobercms.com/docs/database/query#caching-queries)缓存查询
### [](https://octobercms.com/docs/database/query#persistent-caching)持久缓存
您可以使用“[缓存”服务](https://octobercms.com/docs/services/cache)轻松地缓存查询结果。在准备查询时,只需链接`remember`or`rememberForever`方法。
~~~
$users = Db::table('users')->remember(10)->get();
~~~
在此示例中,查询结果将被缓存十分钟。缓存结果时,将不会对数据库运行查询,并且将从为应用程序指定的默认缓存驱动程序中加载结果。
### [](https://octobercms.com/docs/database/query#in-memory-caching)内存中缓存
通过使用内存中缓存,可以防止在同一请求中出现重复查询。默认情况下,此功能对[由模型准备的查询](https://octobercms.com/docs/database/model#retrieving-models)启用,但不对使用`Db`外观直接生成的[查询](https://octobercms.com/docs/database/model#retrieving-models)启用。
~~~
Db::table('users')->get(); // Result from database
Db::table('users')->get(); // Result from database
Model::all(); // Result from database
Model::all(); // Result from in-memory cache
~~~
您可以使用`enableDuplicateCache`或`disableDuplicateCache`方法启用或禁用重复缓存。
~~~
Db::table('users')->enableDuplicateCache()->get();
~~~
如果查询存储在缓存中,则在使用插入,更新,删除或截断语句时将自动清除查询。但是,您可以使用该`flushDuplicateCache`方法手动清除缓存。
~~~
Db::flushDuplicateCache();
~~~
> **注意**:通过命令行界面(CLI)运行时,将完全禁用内存中缓存。
### [](https://octobercms.com/docs/database/query#debugging)调试
您可以在构建查询时使用`dd`或`dump`方法来转储查询绑定和SQL。该`dd`方法将显示调试信息,然后停止执行请求。该`dump`方法将显示调试信息,但允许请求继续执行:
~~~
Db::table('users')->where('votes', '>', 100)->dd();
Db::table('users')->where('votes', '>', 100)->dump();
~~~
- 基本说明
- 基本操作
- 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 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图