PHP教程

thinkphp6----查询构造器

本文主要是介绍thinkphp6----查询构造器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在使用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

打完收工!

这篇关于thinkphp6----查询构造器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!