查询数据

基本查询

// table方法指定完整的数据表名Db::table('think_user')->where('id',1)->find();结果不存在 返回 null

查询数据集

Db::table('think_user')->where('status',1)->select(); //select 方法查询结果不存在,返回空数组

若配置文件中设置了数据表前缀参数可用

Db::name('user')->where('id',1)->find();Db::name('user')->where('status',1)->select();

若数据表没用表前缀,name和table方法一样

findselect方法前可用所有的链式操作,默认find和select方法返回数组

主从查询

分布式数据库,默认查询操作 是在从数据库中进行,若特殊情况需要从主库读取数据用

$data = ['foo' => 'bar', 'bar' => 'foo'];Db::table('think_user')->insert($data);Db::name('user')->master()->where('id',1)->find();

支持某个表写入了数据,当前请求的后续查询操作自动从主库读取

需要在数据库配置文件中增加配置参数

//从主库读取数据'read_master'=>true,

若只需要对某个表进行操作,用readMaster方法

$data = ['foo' => 'bar', 'bar' => 'foo'];Db::table('think_user')->readMaster()->insert($data);//后续所有关于该数据表的查询都走主库

也可以让后续所有数据表的查询都走主库

$data = ['foo' => 'bar', 'bar' => 'foo'];Db::table('think_user')->readMaster(true)->insert($data);//后续数据表的查询都走主库

助手函数

db助手函数更方便查询

db('user')->where('id',1)->find();db('user')->where('status',1)->select();

db助手函数默认重新连接数据库,Db::name或者Db::table方法都是单例
db函数如果需要采用相同的链接,可传入第三个参数

db('user',[],false)->where('id',1)->find();db('user',[],false)->where('status',1)->select();

使用同一个数据库连接,第二个参数为数据库的连接参数,留空表示采用数据库配置文件的配置

版本调整功能
5.0.9db助手函数默认不再强制重新连接

使用Query对象或闭包查询

使用查询对象进行查询:

$query = new \think\db\Query();$query->table('think_user')->where('status',1);Db::find($query);Db::select($query);

或者用闭包函数查询

Db::select(function($query){ $query->table('think_user')->where('status',1);});

值和列查询

查询某个字段的值可以用

// 返回某个字段的值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');Db::table('think_user')->where('status',1)->column('id,name'); // 同tp3的getField

column 方法查询结果不存在,返回空数组

数据集分批处理

若需要处理成千上百条数据库记录,用chunk方法一次获取结果集的一小块,填充每一小块数据到要处理的闭包,
该方法在编写处理大量数据库记录的时候非常有用

全部用户表数据进行分批处理,每次处理 100 个用户记录

Db::table('think_user')->chunk(100, function($users) {
    foreach ($users as $user) { //
    }});// 或者交给回调方法myUserIterator处理Db::table('think_user')->chunk(100, 'myUserIterator');

通过从闭包函数中返回false来中止对数据集的处理:

Db::table('think_user')->chunk(100, function($users) {// 处理结果集...
    return false;});

支持在chunk方法之前调用其它的查询方法

Db::table('think_user')->where('score','>',80)->chunk(100, function($users) {
    foreach ($users as $user) {  //
    }});

chunk方法的处理默认根据主键查询,支持指定字段

Db::table('think_user')->chunk(100, function($users) { // 处理结果集...
    return false;},'create_time');

V5.0.11版本开始,chunk方法支持指定处理数据的顺序

Db::table('think_user')->chunk(100, function($users) {  // 处理结果集...
    return false;},'create_time', 'desc');

JSON类型数据查询(mysql V5.0.1

// 查询JSON类型字段 (info字段为json类型)Db::table('think_user')->where('info$.email','thinkphp@qq.com')->find();