Thinkphp5/TP6条件查询方法

where方法

可以使用 where方法进行 AND条件查询:

  1. Db::table(‘think_user’)
  2. ->where(‘name’,‘like’,‘%thinkphp’)
  3. ->where(‘status’,1)
  4. ->find();

多字段相同条件的AND查询可以简化为如下方式:

  1. Db::table(‘think_user’)
  2. ->where(‘name&title’,‘like’,‘%thinkphp’)
  3. ->find();

whereOr方法

使用whereOr方法进行OR查询:

  1. Db::table(‘think_user’)
  2. ->where(‘name’,‘like’,‘%thinkphp’)
  3. ->whereOr(‘title’,‘like’,‘%thinkphp’)
  4. ->find();

多字段相同条件的OR查询可以简化为如下方式:

  1. Db::table(‘think_user’)
  2. ->where(‘name|title’,‘like’,‘%thinkphp’)
  3. ->find();

闭合/闭包查询

  1. $name = 'thinkphp';
  2. $id = 10;
  3. Db::table('think_user')->where(function ($query) use($name, $id) {
  4. $query->where('name', $name)
  5. ->whereOr('id', '>', $id);
  6. })->select();

生成的SQL语句为:

  1. SELECT FROM think_user WHERE ( name = 'thinkphp' OR id > 10 )

混合查询

where方法和whereOr方法在复杂的查询条件中经常需要配合一起混合使用,下面举个例子:

  1. $result = Db::table('think_user')->where(function ($query) {
  2. $query->where('id', 1)->whereor('id', 2);
  3. })->whereOr(function ($query) {
  4. $query->where('name', 'like', 'think')->whereOr('name', 'like', 'thinkphp');
  5. })->select();

生成的sql语句类似于下面:

  1. SELECT FROM think_user WHERE ( id = 1 OR id = 2 ) OR ( name LIKE 'think' OR name LIKE 'thinkphp' )

注意闭包查询里面的顺序,而且第一个查询方法用where或者whereOr是没有区别的。

示例一:

  1. ->withAttr('owner_user_name', function($value, $lists) {
  2. return db('admin_member')->where('id','=',$lists['owner_user_id'])->value('truename');
  3. })
  4. ->where('customer_id', 'IN', function ($query) use ($where_f) {
  5. $aa=$query->name('crm_customer_record')->where($where_f)->field('r_id')->select();
  6. // dump($aa);exit;
  7. })
  8. 示例二:
  9. ->where(function($query) use($role_id_arr){
  10. $query->whereIn('owner_role_id',$role_id_arr);
  11. })
  12. 示例三:
  13. laravel:闭包/闭合
  14. // $where[] = ['id','in',$ids];//这种无效
  15. // $where[] = ['in'=>['problem_answers.id'=>$ids]];//这种无效
  16. $where[] = [
  17. function ($query) use ($ids) {
  18. $query->whereIn('problem_answers.id', $ids);
  19. },
  20. ];

分块查询、批量插入

  1. // 用户类型=管理人员
  2. $users = Db::name('admin_user')
  3. ->where('tick_user_type',1)
  4. ->field('id,department_selection')
  5. ->select();
  6. $datas = [];
  7. foreach ($users as $v) {
  8. $datassub['user_id'] = $v['id'];
  9. $datassub['structure_id'] = $v['department_selection'];
  10. $datas[] = $datassub;
  11. }
  12. // 用户部门表(admin_user_structure)
  13. Db::name('admin_user_structure')
  14. ->where('id','>',0)
  15. ->delete();
  16. // 每批 200 条
  17. $batchSize = 200;
  18. $chunks = array_chunk($datas, $batchSize);
  19. foreach ($chunks as $c) {
  20. Db::name('admin_user_structure')->insertAll($c);
  21. }

getTableInfo方法

使用getTableInfo可以获取表信息,信息类型 包括 fields,type,bind,pk,以数组的形式展示,可以指定某个信息进行获取

  1. // 获取think_user表所有信息
  2. Db::getTableInfo('think_user');
  3. // 获取think_user表所有字段
  4. Db::getTableInfo('think_user', 'fields');
  5. // 获取think_user表所有字段的类型
  6. Db::getTableInfo('think_user', 'type');
  7. // 获取think_user表的主键
  8. Db::getTableInfo('think_user', 'pk');