ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[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'); ~~~