[https://www.kancloud.cn/manual/thinkphp6\_0/1037538](https://www.kancloud.cn/manual/thinkphp6_0/1037538)
[TOC]
# where
表达式查询是官方推荐使用的查询方式
~~~
//注意使用字符串查询条件(不推荐) :SELECT * FROM think_user WHERE type=1 AND status=1
Db::table('think_user')->whereRaw('type=1 AND status=1')->select();
//字符串查询条件预处理
Db::table('think_user')
->whereRaw("id=:id and username=:name", ['id' => 1 , 'name' => 'thinkphp'])
->select();
//SELECT * FROM think_user WHERE `name`='thinkphp' AND id > 1
Db::table('think_user')
->where('id','>',1)
->where('name','thinkphp')
->select();
//关联数组(主要用于等值`AND`条件)等值 and条件 传入数组作为查询条件:
//SELECT * FROM think_user WHERE `name`='thinkphp' AND status = 1
Db::table('think_user')->where([
'name' => 'thinkphp',
'status'=> 1
])->select();
//索引数组条件查询(推荐)
// 传入关联数组作为查询条件
//SELECT * FROM think_user WHERE `name`='thinkphp' AND status = 1
Db::table('think_user')->where([
['name','=','thinkphp'],
['status','=',1]
])->select();
$where=[
['inmonth','between',[1631808000,1633967999]
['company_id','=','1']
];
Db::table('think_user')->where($where)->select();
//索引数组的组装
$map[] = ['name','like','think'];
$map[] = ['status','=',1];
Db::table('think_user')->where($map)->select();
//数组条件
$map['name'] = 'thinkphp';//普通查询
$map['status'] = 1;//普通查询
$map['id'] = ['>',1];//使用查询表达式
$map['mail'] = ['like','%thinkphp@qq.com%'];//使用查询表达式
Db::table('think_user')->where($map)->select();
~~~
# table
指定操作的数据表。
```
//table方法指定的数据表需要完整的表名
Db::table('think_user')->where('status>1')->select();
//可以指定数据库
Db::table('think_user')->where('status>1')->select();
//name方式简化数据表前缀的传入(前缀可省略)
Db::name('user')->where('status>1')->select();
```
# alias
用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等
~~~
//SELECT * FROM think_user a INNER JOIN think_dept b ON b.user_id= a.id
Db::table('think_user')
->alias('a')
->join('think_dept b ','b.user_id= a.id')
->select();
//SELECT * FROM think_user user INNER JOIN think_dept dept ON dept.user_id= user.id
Db::table('think_user')
->alias(['think_user'=>'user','think_dept'=>'dept'])
->join('think_dept','dept.user_id= user.id')
->select();
~~~
# field
标识要返回或者操作的字段,可以用于查询和写入操作
~~~
//SELECT id,nickname as name FROM user
Db::table('user')->field('id,nickname as name')->select();
//SELECT id,nickname as name FROM user
Db::table('user')->field(['id','nickname'=>'name'])->select();
~~~
# strict
设置是否严格检查字段名
~~~
// 关闭字段严格检查
Db::name('user')
->strict(false)
->insert($data);
~~~
>[danger]系统默认值是由数据库配置参数`fields_strict`决定;
设置关闭全局的严格检查配置`'fields_strict' => false,`
# limit
指定查询和操作的数量。
~~~
Db::table('article')->limit(10)->select();
Db::table('article')->limit(10,25)->select();
~~~
# page
用于分页查询。
~~~
// 查询第一页数据
Db::table('article')->page(1,10)->select();
// 查询第二页数据
Db::table('article')->page(2,10)->select();
//`page`方法还可以和`limit`方法配合使用,例如:
Db::table('article')->limit(25)->page(3)->select();
//等同
Db::table('article')->page(3,25)->select();
~~~
# order
对操作的结果排序或者优先级限制。
~~~
Db::table('user')
->where('status', 1)
->order('id', 'desc')
->limit(5)
->select();
//支持使用数组对多个字段的排序
Db::table('user')
->where('status', 1)
->order(['order','id'=>'desc'])
->limit(5)
->select();
~~~
# group
用于结合合计函数,根据一个或多个列对结果集进行分组
~~~
//我们都查询结果按照用户id进行分组统计:ELECT user_id,username,max(score) FROM score GROUP BY user_id
Db::table('user')
->field('user_id,username,max(score)')
->group('user_id')
->select();
//也支持对多个字段进行分组:SELECT user_id,test_time,username,max(score) FROM user GROUP BY user_id,test_time
Db::table('user')
->field('user_id,test_time,username,max(score)')
->group('user_id,test_time')
->select();
~~~
# having
用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据
~~~
//SELECT username,max(score) FROM score GROUP BY user_id HAVING count(test_time)>3
Db::table('score')
->field('username,max(score)')
->group('user_id')
->having('count(test_time)>3')
->select();
~~~
# join
~~~
join ( mixed join [, mixed $condition = null [, string $type = 'INNER']] ) 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行
leftJoin ( mixed join [, mixed $condition = null ] ) 即使右表中没有匹配,也从左表返回所有的行
rightJoin ( mixed join [, mixed $condition = null ] ) 即使左表中没有匹配,也从右表返回所有的行
fullJoin ( mixed join [, mixed $condition = null ] ) 只要其中一个表中存在匹配,就返回行
~~~
~~~
Db::table('think_user')
->alias('a')
->join(['think_work'=>'w'],'a.id=w.artist_id')
->join(['think_card'=>'c'],'a.card_id=c.id')
->select();
~~~
# union
用于合并两个或多个 SELECT 语句的结果集。
~~~
Db::field('name')
->table('think_user_0')
->union('SELECT name FROM think_user_1')
->union('SELECT name FROM think_user_2')
->select();
~~~
支持UNION ALL 操作,例如:
~~~
Db::field('name')
->table('think_user_0')
->unionAll('SELECT name FROM think_user_1')
->unionAll('SELECT name FROM think_user_2')
->select();
~~~
# distinct
用于返回唯一不同的值 。
~~~
//回`user_login`字段不同的数据 SELECT DISTINCT user_login FROM think_user
Db::table('think_user')->distinct(true)->field('user_login')->select();
~~~
# lock
用于数据库的锁机制,如果在查询或者执行操作的时候使用
`Lock`方法是用于数据库的锁机制,如果在查询或者执行操作的时候使用:
~~~
Db::name('user')->where('id',1)->lock(true)->find();
~~~
就会自动在生成的SQL语句最后加上`FOR UPDATE` (Oracle数据库:`FOR UPDATE NOWAIT`)。加上FOR UPDATE后这条数据就会被锁定,保证了此条数据不会被其他语句修改
lock方法支持传入字符串用于一些特殊的锁定要求,例如:
~~~
Db::name('user')->where('id',1)->lock('lock in share mode')->find();
~~~
# cache
`cache`方法用于查询缓存操作,也是连贯操作方法之一。
**cache**可以用于`select`、`find`、`value`和`column`方法,以及其衍生方法,使用`cache`方法后,在缓存有效期之内不会再次进行数据库查询操作,而是直接获取缓存中的数据,关于数据缓存的类型和设置可以参考缓存部分。
对find方法使用cache方法如下:
~~~
Db::table('user')->where('id',5)->cache(true)->find();
~~~
第一次查询结果会被缓存,第二次查询相同的数据的时候就会直接返回缓存中的内容,而不需要再次进行数据库查询操作。
默认情况下, 缓存有效期是由默认的缓存配置参数决定的,但`cache`方法可以单独指定,例如下面:表示对查询结果的缓存有效期60秒。
~~~
Db::table('user')->cache(true,60)->find();
// 或者使用下面的方式 是等效的
Db::table('user')->cache(60)->find();
~~~
cache方法可以指定缓存标识:
~~~
Db::table('user')->cache('key',60)->find();
~~~
>[danger] 指定查询缓存的标识可以使得查询缓存更有效率。
这样,在外部就可以通过`\think\Cache`类直接获取查询缓存的数据,例如:
~~~
$result = Db::table('user')->cache('key',60)->find();
$data = \think\facade\Cache::get('key');
~~~
`cache`方法支持设置缓存标签,例如:
~~~
Db::table('user')->cache('key',60,'tagName')->find();
~~~
### **缓存自动更新**
这里的缓存自动更新是指一旦数据更新或者删除后会自动清理缓存(下次获取的时候会自动重新缓存)。
当你删除或者更新数据的时候,可以调用相同`key`的`cache`方法,会自动更新(清除)缓存,例如:
~~~
Db::table('user')->cache('user_data')->select([1,3,5]);
Db::table('user')->cache('user_data')->update(['id'=>1,'name'=>'thinkphp']);
Db::table('user')->cache('user_data')->select([1,3,5]);
~~~
最后查询的数据不会受第一条查询缓存的影响,确保查询和更新或者删除使用相同的缓存标识才能自动清除缓存。
如果使用主键进行查询和更新(或者删除)的话,无需指定缓存标识会自动更新缓存
~~~
Db::table('user')->cache(true)->find(1);
Db::table('user')->cache(true)->where('id', 1)->update(['name'=>'thinkphp']);
Db::table('user')->cache(true)->find(1);
~~~
# comment
用于在生成的SQL语句中添加注释内容
~~~
//SELECT username,score FROM think_score ORDER BY score desc LIMIT 10 /* 查询考试前十名分数 */
Db::table('think_score')->comment('查询考试前十名分数')
->field('username,score')
->limit(10)
->order('score desc')
->select();
~~~
# fetchSql
用于直接返回SQL而不是执行查询,适用于任何的CURD操作方法
~~~
echo Db::table('user')->fetchSql(true)->find(1);
//输出;SELECT * FROM user where `id` = 1
~~~
# force
用于数据集的强制索引操作,例如:
~~~
Db::table('user')->force('user1')->select();
~~~
>[danger]对查询强制使用`user1`索引,`user1`必须是数据表实际创建的索引名称
# partition
用于`MySQL`数据库的分区查询,用法如下:
~~~
// 用于查询
Db::name('log')
->partition(['p1','p2'])
->select();
// 用于写入
Db::name('user')
->partition('p1')
->insert(['name' => 'think', 'score' => 100']);
~~~
# failException
设置查询数据为空时是否需要抛出异常,用于`select`和`find`方法,例如:
~~~
// 数据不存在的话直接抛出异常
Db::name('blog')
->where('status',1)
->failException()
->select();
// 数据不存在返回空数组 不抛异常
Db::name('blog')
->where('status',1)
->failException(false)
->select();
~~~
或者可以使用更方便的查空报错
~~~
// 查询多条
Db::name('blog')
->where('status', 1)
->selectOrFail();
// 查询单条
Db::name('blog')
->where('status', 1)
->findOrFail();
~~~
# sequence
用于`pgsql`数据库指定自增序列名,其它数据库不必使用,用法为:
~~~
Db::name('user')
->sequence('user_id_seq')
->insert(['name'=>'thinkphp']);
~~~
# replace
`replace`方法用于设置`MySQL`数据库`insert`方法或者`insertAll`方法写入数据的时候是否适用`REPLACE`方式
即**他是用来判断添加的这条语句 根据主键判断是否存在。**
主键存在**则替换**:
主键不存在**则新增**:
~~~
$data = [
['foo' => 'bar', 'bar' => 'foo'],
['foo' => 'bar1', 'bar' => 'foo1'],
['foo' => 'bar2', 'bar' => 'foo2']
];
//此处主键不存在着新增
Db::name('user')->replace()->insertAll($data);
~~~
# extra
用于`CURD`查询,例如:
~~~
Db::name('user')
->extra('IGNORE')
->insert(['name' => 'think']);
Db::name('user')
->extra('DELAYED')
->insert(['name' => 'think']);
Db::name('user')
->extra('SQL_BUFFER_RESULT')
->select();
~~~
# duplicate
用于设置`DUPLICATE`查询,用法示例:
~~~
Db::name('user')
->duplicate(['score' => 10])
->insert(['name' => 'think']);
~~~
# procedure
用于设置当前查询是否为存储过程查询,用法如下:
~~~
$resultSet = Db::procedure(true)
->query('call procedure_name');
~~~
- 空白目录
- php语法结构
- 安装与更新
- 开启调试模式及代码跟踪器
- 架构
- 源码分析
- 应用初始化
- 请求流程
- 中间件源码分析
- 请求处理源码分析
- Request源码分析
- 模板编译流程
- 路由与请求流程
- 容器
- 获取目录位置
- 入口文件
- 多应用模式及URL访问
- 依赖注入与容器
- 容器属性及方法
- Container
- App
- facade
- 中间件(middleware)
- 系统服务
- extend 扩展类库
- 笔记
- 配置
- env配置定义及获取
- 配置文件的配置获取
- 单应用模式-(配置)文件目录结构(默认)
- 多应用模式(配置)文件目录结构(配置文件)
- 配置文件
- 应用配置:app.php
- 缓存配置: cache.php
- 数据库配置:database.php
- 路由和URL配置:route.php
- Cookie配置:cookie.php
- Session配置:session.php
- 命令行配置:console.php
- 多语言配置:lang.php
- 日志配置:log.php
- 页面Trace配置:trace.php
- 磁盘配置: filesystem.php
- 中间件配置:middleware.php
- 视图配置:view.php
- 改成用yaconf配置
- 事件
- 例子:省略事件类的demo
- 例子2:完整事件类
- 例子3:事件订阅,监听多个事件
- 解析
- 路由
- 路由定义
- 路由地址
- 变量规则
- MISS路由
- URL生成
- 闭包支持
- 路由参数
- 路由中间件
- 路由分组
- 资源路由
- 注解路由
- 路由绑定
- 域名路由
- 路由缓存
- 跨域路由
- 控制器
- 控制器定义
- 空控制器、空操作
- 空模块处理
- RESTFul资源控制器
- 控制器中间件
- 请求对象Request(url参数)
- 请求信息
- 获取输入变量($_POST、$_GET等)
- 请求类型的获取与伪装
- HTTP头信息
- 伪静态
- 参数绑定
- 请求缓存
- 响应对象Response
- 响应输出
- 响应参数
- 重定向
- 文件下载
- 错误页面的处理办法
- 应用公共文件common.php
- 模型
- 模型定义及常规属性
- 模型数据获取与模型赋值
- 查询
- 数据集
- 增加
- 修改
- 删除
- 条件
- 查询范围scope
- 获取器
- 修改器
- 搜索器
- 软删除
- 模型事件
- 关联预载入
- 模型关联
- 一对一关联
- 一对多关联
- 多对多关联
- 自动时间戳
- 事务
- 数据库
- 查询构造器
- 查询合集
- 子查询
- 聚合查询
- 时间查询
- 视图查询(比join简单)
- 获取查询参数
- 快捷方法
- 动态查询
- 条件查询
- 打印sql语句
- 增
- 删
- 改
- 查
- 链式操作
- 查询表达式
- 分页查询
- 原生查询
- JSON字段
- 链接数据库配置
- 分布式数据库
- 查询事件
- Db获取器
- 事务操作
- 存储过程
- Db数据集
- 数据库驱动
- 视图
- 模板
- 模板配置
- 模板位置
- 模板渲染
- 模板变量与赋值(assign)
- 模板输出替换
- url生成
- 模板详解
- 内置标签
- 三元运算
- 变量输出
- 函数输出
- Request请求参数
- 模板注释及原样输出
- 模板继承
- 模板布局
- 原生PHP
- 模板引擎
- 视图过滤
- 视图驱动
- 验证
- 验证进阶之最终版
- 错误和日志
- 异常处理
- 日志处理
- 调试
- 调试模式
- Trace调试
- SQL调试
- 变量调试
- 远程调试
- 杂项
- 缓存
- Session
- Cookie
- 多语言
- 上传
- 扩展说明
- N+1查询
- TP类库
- 扩展类库
- 数据库迁移工具
- Workerman
- think助手工具库
- 验证码
- Swoole
- request
- app
- Response
- View
- Validate
- Config
- 命令行
- 助手函数
- 升级指导(功能的添加与删除说明)
- siyucms
- 开始
- 添加页面流程
- 列表页加载流程
- 弹出框
- 基础控制器
- 基础模型
- 快速构建
- 表单form构建
- 表格table构建
- MakeBuilder
- 前端组件
- 日期组件
- layer 弹层组件
- Moment.js 日期处理插件
- siyucms模板布局
- 函数即其变量
- 前端页面
- $.operate.方法
- $.modal.方法:弹出层
- $.common.方法:通用方法
- 被cms重写的表格options
- 自定义模板
- 搜索框
- 自定义form表单
- 获取表单搜索参数并组装为url字符串