thinkphp5数据库查询技巧汇总

关于数据库的增删改查基本上是每一个开发人员必备的基础技能,本篇日记波波以thinkphp开发文档为基础将thinkphp5中数据库查询技巧进行汇总整理。

thinkPHP5 ajax提交表单

一、查询值为NULL的数据。

  1. // 查询email为空,并且name不为空的用户数据
  2. User::whereNull('email')
  3.     ->whereNotNull('name')
  4.     ->select();

二、多个字段同一个查询条件。

快捷查询方式是一种多字段相同查询条件的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,例如:

  1. User::where('name|title','like','thinkphp%')
  2.     ->where('create_time&update_time','>',0)
  3.     ->find();

三、数组对象查询。

如果你升级老版本的系统到5.1,由于数组查询方式的变化,而你又不希望全部换成表达式查询,那么可以使用数组对象查询。

  1. use think\db\Where;
  2. // 5.0的数组查询条件
  3. $map = [
  4.     'name'   => ['like', 'thinkphp%'],
  5.     'title'  => ['like', '%think%'],
  6.     'id'     => ['>', 10],
  7.     'status' => 1,
  8. ];
  9. User::where(new Where($map))
  10.     ->select();

只需要把原来的“where($map)”改成“where(new Where($map))”即可完成简单的数组查询升级兼容。

四、时间字段范围查询。

你可以查询当前时间是否在两个时间字段区间范围内,通常用于一些活动以及优惠券的有效期查询等等。

  1. // 查询有效期内的活动
  2. Event::whereBetweenTimeField('start_time','end_time')
  3.     ->select();
  4. // 查询没有开始或者已经过期的活动
  5. Event::whereNotBetweenTimeField('start_time','end_time')
  6.     ->select();

五、字段比较查询。

可以直接比较两个字段的大小值进行查询。

  1. User::whereColumn('update_time', '>', 'create_time')
  2.     ->select();
  3. User::whereColumn('score1', '>', 'score2')
  4.     ->select();

如果两个字段的值相等,还可以简化成如下查询形式。

  1. User::whereColumn('score1', 'score2')
  2.     ->select();

六、动态查询。

使用动态查询可以进一步简化你的查询条件,不过缺点是可能无法做到IDE的自动提示了,例如:

  1. // 根据邮箱(email)查询用户信息
  2. User::whereEmail('thinkphp@qq.com')
  3.     ->find();
  4. // 根据昵称(nick_name)查询用户
  5. User::whereNickName('like', '%流年%')
  6.     ->select();
  7. // 根据邮箱查询用户信息
  8. User::getByEmail('thinkphp@qq.com');
  9. // 根据昵称(nick_name)查询用户信息
  10. User::getByNickName('流年');
  11. // 根据邮箱查询用户的昵称
  12. User::getFieldByEmail('thinkphp@qq.com', 'nick_name');
  13. // 根据昵称(nick_name)查询用户邮箱
  14. User::getFieldByNickName('流年', 'email');

七、条件查询。

利用条件查询你可以很方便的控制查询条件分支,你再也不需要在组装查询条件的时候写大量的if和else了。

  1. User::when($conditionfunction ($query) {
  2.     // 满足条件后执行
  3.     $query->where('score', '>', 80)->limit(10);
  4. })->select();

并且支持不满足条件的分支查询,并且支持多次调用when方法。

  1. User::when($conditionfunction ($query) {
  2.     // 满足条件后执行
  3.     $query->where('score', '>', 80)->limit(10);
  4. }, function ($query) {
  5.     // 不满足条件执行
  6.     $query->where('score', '>', 60);
  7. });

八、JSON查询。

如果你的字段类型使用的是JSON类型,那么可以直接使用框架提供的JSON查询支持。

  1. User::where('info->nickname', 'ThinkPHP')
  2.     ->find();

注意,需要在模型里面定义JSON字段属性。

  1. <?php
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model
  5. {
  6.     // 设置json类型字段
  7.     protected $json = ['info'];
  8. }

如果使用Db查询的话,可以改为

  1. $user = Db::name('user')
  2.     ->json(['info'])
  3.     ->where('info->nickname','ThinkPHP')
  4.     ->find();

九、数据分批处理。

1、自动分批写入。

  1. // 自动分批多次写入数据库 每次最多写入1000条
  2. Db::name('user')
  3.     ->limit(1000)
  4.     ->insertAll($dataList);

如果是使用模型的话,建议直接使用saveAll方法而不需要limit方法。

2、对于大量数据的处理操作,可以使用chunk分批处理方法。

  1. // 每次处理100个数据
  2. User::chunk(100, function($users) {
  3.     foreach ($users as $user) {
  4.         // 处理数据
  5.     }
  6. });

十、从主库读取。

如果你使用了数据库的主从分离,当刚写入数据后,数据库的主从同步可能还没来得及同步,这个时候立刻查询数据可能会出错,你可以使用下面的方法从主库读取。

  1. $user = User::create($data);
  2. $user->readMaster()->select();

你可以全局配置数据写入后自动读取主库。

  1. // 模型写入后自动读取主服务器
  2. 'read_master'     => true,

总结:

上述示例代码均以模型用法为例。善于运用查询构造器封装的快捷方法,可以大大提高开发效率,让你更专注于业务逻辑,而不是怎么写查询代码。

 

波波

发表评论

您必须 登录 才能发表留言!