在使用Thinkphp开发项目的时候,数据查询是常见的操作,下面就整理一下常见的查询构造器:
一、查询单个数据
Db::table('think_user')->where('id', 1)->find(); Db::table('think_user')->where('id', 1)->findOrEmpty(); // 不存在返回空对象 Db::table('think_user')->where('id', 1)->findOrFail(); // 不存在抛异常
二、查询数据集
Db::table('think_user')->where('status', 1)->select(); Db::table('think_user')->where('status', 1)->select()->toArray(); // 可转化为数组 Db::table('think_user')->where('status',1)->selectOrFail(); // 抛异常
三、获取字段的值
Db::table('think_user')->where('id', 1)->value('name'); // 不存在返回null
四、查询某一列的值
Db::table('think_user')->where('status',1)->column('name'); // 返回数组 Db::table('think_user')->where('status',1)->column('name', 'id'); // 指定id字段的值作为索引 // 指定id字段的值作为索引 返回所有数据 Db::table('think_user')->where('status',1)->column('*','id');
五、查询大数据【数据分批】
当数据量比较大的时候,可以使用【chunk】来获取数据的某一小块,然后对数据做闭包处理:
Db::table('think_user')->chunk(100, function($users) { foreach ($users as $user) { // } });
六、where查询
where('字段名','查询表达式','查询条件'); // 查询表达式
示例代码:
1、基本查询
Db::name('user')->where('id','=',100)->select(); Db::name('user')->where('id',100)->select(); // 等上 Db::name('user')->where('id','<>',100)->select(); // 不等于 Db::name('user')->where('id','>',100)->select(); // 大于 Db::name('user')->where('id','>=',100)->select(); // 大于等于 Db::name('user')->where('id', '<', 100)->select(); // 小于 Db::name('user')->where('id', '<=', 100)->select(); // 小于等于
2、模糊查询
Db::name('user')->where('name', 'like', 'thinkphp%')->select(); // LIKE 模糊查询 Db::name('user')->where('name', 'like', ['%think','php%'],'OR')->select(); // LIKE 支持数组 快捷: Db::name('user')->whereLike('name','thinkphp%')->select(); Db::name('user')->whereNotLike('name','thinkphp%')->select();
3、区间查询
Db::name('user')->where('id','between','1,8')->select(); Db::name('user')->where('id','between',[1,8])->select(); // 快捷 Db::name('user')->whereBetween('id','1,8')->select(); Db::name('user')->whereNotBetween('id','1,8')->select();
4、IN查询
Db::name('user')->where('id','in','1,5,8')->select(); Db::name('user')->where('id','in',[1,5,8])->select(); // 快捷: Db::name('user')->whereIn('id','1,5,8')->select(); Db::name('user')->whereNotIn('id','1,5,8')->select();
5、NULL查询
Db::name('user')->where('name', null)->where('email','null')->where('name','not null')->select(); Db::name('user')->where('title','=', 'null')->where('name','=', 'not null')->select(); Db::name('user')->whereNull('name')->whereNull('email')->whereNotNull('name')->select();
6、多条件查询
Db::table('think_user')->where(['name'=>'thinkphp','status'=>1])->select(); SQL:SELECT * FROM think_user WHERE `name`='thinkphp' AND status = 1
或:
$map[] = ['name','like','think']; $map[] = ['status','=',1]; Db::table('think_user')->where($map)->select();
七、链式操作
1、where
Db::table('think_user')->where(['name'=>'thinkphp','status'=>1])->select(); // 多条件 Db::table('think_user')->whereRaw('type=1 AND status=1')->select(); // 字符串条件
2、table
Db::table('think_user')->where('status>1')->select(); Db::field('user.name,role.title')->table('think_user user,think_role role')->limit(10)->select(); Db::field('user.name,role.title')->table(['think_user'=>'user','think_role'=>'role'])->limit(10)->select();
3、alias:起别名
Db::table('think_user')->alias('a')->join('think_dept b ','b.user_id= a.id')->select();
4、field:指定字段
Db::table('user')->field('id,title,content')->select(); Db::table('user')->field('id,nickname as name')->select(); // 字段起别名 Db::table('user')->field(['id','title','content'])->select(); // 数组 Db::table('user')->field('*')->select();// 所有 // 排除字段 Db::table('user')->withoutField('content')->select(); // 或 Db::table('user')->withoutField('user_id,content')->select(); //或者用 Db::table('user')->withoutField(['user_id','content'])->select();
5、limit:指定查询或操作的数量
Db::table('user')->where('status',1)->field('id,name')->limit(10)->select(); Db::table('article')->limit(10,25)->select(); // 可用于分页
6、page:分页
使用:limit
// 查询第一页数据 Db::table('article')->limit(0,10)->select(); // 查询第二页数据 Db::table('article')->limit(10,10)->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();
7、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();
8、group:分组
Db::table('user')->field('user_id,username,max(score)')->group('user_id')->select(); Db::table('user')->field('user_id,test_time,username,max(score)')->group('user_id,test_time')->select(); // 多字段分组
9、having:配合group做分组筛选
Db::table('score')->field('username,max(score)')->group('user_id')->having('count(test_time)>3')->select();
10、join:查询
inner join:默认,如果表中有至少一个匹配,则返回行; left join:右表中没有匹配,也从左表中返回; right join:左表中没有匹配,也从右表中返回; full join::只要其中一个表中存在匹配,就返回行;
代码示例:
Db::table('think_artist')->alias('a')->join('work w','a.id = w.artist_id')->join('card c','a.card_id = c.id')->select(); 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(); // left join Db::table('think_user')->alias('a')->leftJoin('word w','a.id = w.artist_id')->select(); // 也可是子查询 $subsql = Db::table('think_work')->where('status',1)->field('artist_id,count(id) count')->group('artist_id')->buildSql(); Db::table('think_user')->alias('a')->join([$subsql=> 'w'], 'a.artist_id = w.artist_id')->select();
11、union:用于合并多个SELECT结果集
Db::field('name')->table('think_user_0')->union('SELECT name FROM think_user_1')->union('SELECT name FROM think_user_2')->select(); Db::field('name')->table('think_user_0')->unionAll('SELECT name FROM think_user_1')->unionAll('SELECT name FROM think_user_2')->select();
12、distinct:用于返回唯一不同的值
Db::table('think_user')->distinct(true)->field('user_login')->select();
八、聚合查询
Db::table('think_user')->count(); // 统计数量 Db::table('think_user')->max('score'); // 最大 Db::table('think_user')->min('score'); // 最小 Db::table('think_user')->avg('score'); // 平均 Db::table('think_user')->sum('score'); // 求和
九、分页查询
$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate(10); $page = $list->render(); // 获取分页显示 $count = $list->total(); // 获取总记录
分页后格式化数据:
$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate()->each(function($item, $key){ $item['nickname'] = 'think'; return $item; }); // 如果是模型类操作分页数据的话,each方法的闭包函数中不需要使用返回值,例如: $list = User::where('status',1)->order('id', 'desc')->paginate()->each(function($item, $key){ $item->nickname = 'think'; });
设置分页参数:
list_rows:每页数量 page:当前页 path:url路径 query:url额外参数 fragment:url锚点 var_page:分页变量
$list = Db::name('user')->where('status',1)->paginate([ 'list_rows'=> 20, 'var_page' => 'page', ]);
十、高级查询
1、快捷查询
快捷查询方式是一种多字段相同查询条件的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,可以实现下面的查询。
Db::table('think_user')->where('name|title','like','thinkphp%')->where('create_time&update_time','>',0)->find();
2、批量(字段)查询
Db::table('think_user')->where([ ['name', 'like', 'thinkphp%'], ['title', 'like', '%thinkphp'], ['id', '>', 0], ['status', '=', 1], ])->select();
Db::table('think_user')->where([ ['name', 'like', 'thinkphp%'], ['title', 'like', '%thinkphp'], ['id', 'exp', Db::raw('>score')], ['status', '=', 1], ])->select();
数组查询方式:
Db::table('think_user')->where([ ['name', 'like', $name . '%'], ['title', 'like', '%' . $title], ['id', '>', $id], ['status', '=', $status], ])->select();
多个条件组合:
$map1 = [ ['name', 'like', 'thinkphp%'],['title', 'like', '%thinkphp'] ]; $map2 = [ ['name', 'like', 'kancloud%'],['title', 'like', '%kancloud'] ]; Db::table('think_user')->whereOr([ $map1, $map2 ])->select();
3、闭包查询
$name = 'thinkphp'; $id = 10; Db::table('think_user')->where(function ($query) use($name, $id) { $query->where('name', $name) ->whereOr('id', '>', $id); })->select();
4、混合查询
Db::table('think_user') ->where('name', 'like', 'thinkphp%') ->where(function ($query) { $query->where('id', '<', 10); })->select();
5、字符串查询
Db::table('think_user')->whereRaw('id > 0 AND name LIKE "thinkphp%"')->select(); // 为了安全,可绑定参数 Db::table('think_user')->whereRaw('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])->select();
快捷方法:
6、动态查询机制,简化查询
示例:
// 根据邮箱查询 $user = Db::table('user')->whereEmail('thinkphp@qq.com')->find(); $user = Db::table('user')->getByEmail('thinkphp@qq.com'); $email = Db::table('user')->getFieldByNickName('流年', 'email'); // 根据昵称查询 $email = Db::table('user')->whereNickName('like', '%流年%')->select(); $user = Db::table('user')->field('id,name,nick_name,email')->getByNickName('流年'); $nickname = Db::table('user')->getFieldByEmail('thinkphp@qq.com', 'nick_name');
7、条件查询
// 查询构造器支持条件查询 Db::name('user')->when($condition, function ($query) { // 满足条件后执行 $query->where('score', '>', 80)->limit(10); })->select(); // 并且支持不满足条件的分支查询 Db::name('user')->when($condition, function ($query) { // 满足条件后执行 $query->where('score', '>', 80)->limit(10); }, function ($query) { // 不满足条件执行 $query->where('score', '>', 60); });
以上只是列举梳理了常用到的查询,更多查询方式见:
https://www.kancloud.cn/manual/thinkphp6_0/1037530
打完收工!