查询数据
基本查询
// 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方法一样
find
和select
方法前可用所有的链式操作,默认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.9 | db助手函数默认不再强制重新连接 |
使用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();
尊贵的董事大人
英文标题不为空时 视为本栏投稿
需要关键字 描述 英文标题