目录
一:背景
二:查询实例
三:总结
一:背景
我们在实际业务的开发过程中,经常会碰到这样的场景,查询某些部门的客户信息,查询下过订单的客户信息。这里查询客户信息实际上就用到了子查询,通常客户表会有一个字段表示归属员工。通过这个字段可以知道员工的id。同样的员工表会有部门信息,同时订单表也有客户信息。这样我们在客户信息要做到两步。第一步实际上是查询员工id或者客户id的集合,第二步再通过这些集合查询客户表获取客户信息。
二:查询实例
1:比如说我们查询某个部门的客户信息
$customerList = Db::name('customer')
->when($param['customer_type'] ?? false, function ($query) use ($param) {
$query->where('user_id', 'in', function ($query) use ($param) {
return $query->name('user')->where('structure_id','in',function($query) use ($param) {
return $query->name('structure')->when(true,function($query) use ($param) {
$query->where('id', '=', $param['dept_id']);
})->field('id');
})->field('id');
});
})
->field('id,name,create_time')
->limit(100)
->select()
->toArray();
这里我们构造两个子查询,第一个子查询查询员工信息,第二个子查询查询部门信息,查询部门的时候我们传入部门id作为参数,这样我们这个sql就实现了查询部门id是特定值的客户的信息
这里传入的参数还可以和部门有关的名称或者等级等,这样我们只需要根据入参的不同修改子查询
return $query->name('structure')->when(true,function($query) use ($param) {
$query->where('id', '=', $param['dept_id']);
})->field('id');
比如说查询名称:
return $query->name('structure')->when(true,function($query) use ($param) {
$query->where('name', 'like', '%-'.$param['dept_name']. '-%');
})->field('id');
这样也方便我们后期的搜索。
我们还可以根据多个条件查询:
return $query->name('structure')->when(true,function($query) use ($param) {
$query->where('id', '=', $param['dept_id']);
$query->whereOr('level', 'like', '%-'.$param['dept_level']. '-%');
})->field('id');
同时查询满足部门id和等级的条件搜索。
2:查询下过订单的客户信息
$customerList = Db::name('customer')
->when($param['customer_type'] ?? false, function ($query) use ($param) {
$query->where('id', 'in', function ($query) use ($param) {
return $query->name('order')->where('status','=',1)->field('uid');
});
})
->field('id,name,create_time')
->limit(100)
->select()
->toArray();
我们这里查询订单状态是1的客户id集合,再通过id集合获取客户信息。这样查询有个好处就是我们的sql语句会比较短,这样sql执行过程中也不会出现sql语句超过长度。试想下如果我们不使用子查询先根据条件查询到下过订单的客户id集合,然后再通过id集合通过where in的方式查询客户表,如果我们的下单客户数量巨大,那么这个sql语句是很长的。执行会出问题。
三:总结
以上就是thinkphp下子查询的使用,通过子查询,配合多个表的联查和关联搜索还是很方便的。