关于数据库的增删改查基本上是每一个开发人员必备的基础技能,本篇日记波波以thinkphp开发文档为基础将thinkphp5中数据库查询技巧进行汇总整理。
一、查询值为NULL的数据。
- // 查询email为空,并且name不为空的用户数据
- User::whereNull('email')
- ->whereNotNull('name')
- ->select();
二、多个字段同一个查询条件。
快捷查询方式是一种多字段相同查询条件的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,例如:
- User::where('name|title','like','thinkphp%')
- ->where('create_time&update_time','>',0)
- ->find();
三、数组对象查询。
如果你升级老版本的系统到5.1,由于数组查询方式的变化,而你又不希望全部换成表达式查询,那么可以使用数组对象查询。
- use think\db\Where;
- // 5.0的数组查询条件
- $map = [
- 'name' => ['like', 'thinkphp%'],
- 'title' => ['like', '%think%'],
- 'id' => ['>', 10],
- 'status' => 1,
- ];
- User::where(new Where($map))
- ->select();
只需要把原来的“where($map)”改成“where(new Where($map))”即可完成简单的数组查询升级兼容。
四、时间字段范围查询。
你可以查询当前时间是否在两个时间字段区间范围内,通常用于一些活动以及优惠券的有效期查询等等。
- // 查询有效期内的活动
- Event::whereBetweenTimeField('start_time','end_time')
- ->select();
- // 查询没有开始或者已经过期的活动
- Event::whereNotBetweenTimeField('start_time','end_time')
- ->select();
五、字段比较查询。
可以直接比较两个字段的大小值进行查询。
- User::whereColumn('update_time', '>', 'create_time')
- ->select();
- User::whereColumn('score1', '>', 'score2')
- ->select();
如果两个字段的值相等,还可以简化成如下查询形式。
- User::whereColumn('score1', 'score2')
- ->select();
六、动态查询。
使用动态查询可以进一步简化你的查询条件,不过缺点是可能无法做到IDE的自动提示了,例如:
- // 根据邮箱(email)查询用户信息
- User::whereEmail('[email protected]')
- ->find();
- // 根据昵称(nick_name)查询用户
- User::whereNickName('like', '%流年%')
- ->select();
- // 根据邮箱查询用户信息
- User::getByEmail('[email protected]');
- // 根据昵称(nick_name)查询用户信息
- User::getByNickName('流年');
- // 根据邮箱查询用户的昵称
- User::getFieldByEmail('[email protected]', 'nick_name');
- // 根据昵称(nick_name)查询用户邮箱
- User::getFieldByNickName('流年', 'email');
七、条件查询。
利用条件查询你可以很方便的控制查询条件分支,你再也不需要在组装查询条件的时候写大量的if和else了。
- User::when($condition, function ($query) {
- // 满足条件后执行
- $query->where('score', '>', 80)->limit(10);
- })->select();
并且支持不满足条件的分支查询,并且支持多次调用when方法。
- User::when($condition, function ($query) {
- // 满足条件后执行
- $query->where('score', '>', 80)->limit(10);
- }, function ($query) {
- // 不满足条件执行
- $query->where('score', '>', 60);
- });
八、JSON查询。
如果你的字段类型使用的是JSON类型,那么可以直接使用框架提供的JSON查询支持。
- User::where('info->nickname', 'ThinkPHP')
- ->find();
注意,需要在模型里面定义JSON字段属性。
- <?php
- namespace app\index\model;
- use think\Model;
- class User extends Model
- {
- // 设置json类型字段
- protected $json = ['info'];
- }
如果使用Db查询的话,可以改为
- $user = Db::name('user')
- ->json(['info'])
- ->where('info->nickname','ThinkPHP')
- ->find();
九、数据分批处理。
1、自动分批写入。
- // 自动分批多次写入数据库 每次最多写入1000条
- Db::name('user')
- ->limit(1000)
- ->insertAll($dataList);
如果是使用模型的话,建议直接使用saveAll方法而不需要limit方法。
2、对于大量数据的处理操作,可以使用chunk分批处理方法。
- // 每次处理100个数据
- User::chunk(100, function($users) {
- foreach ($users as $user) {
- // 处理数据
- }
- });
十、从主库读取。
如果你使用了数据库的主从分离,当刚写入数据后,数据库的主从同步可能还没来得及同步,这个时候立刻查询数据可能会出错,你可以使用下面的方法从主库读取。
- $user = User::create($data);
- $user->readMaster()->select();
你可以全局配置数据写入后自动读取主库。
- // 模型写入后自动读取主服务器
- 'read_master' => true,
总结:
上述示例代码均以模型用法为例。善于运用查询构造器封装的快捷方法,可以大大提高开发效率,让你更专注于业务逻辑,而不是怎么写查询代码。