作者 liyuhang

gx

... ... @@ -60,7 +60,7 @@ class Base extends Model
public function read($condition,$files = ['*'])
{
$query = $this->formatQuery($condition);
$info = $query->select($files)->where($condition)->first();
$info = $query->select($files)->first();
if (empty($info)) {
return false;
}
... ... @@ -103,96 +103,58 @@ class Base extends Model
}
public function formatQuery($map,$val = ''){
/**
* @param $map = ['$k'=>['like',$v],$k1]
* @param $val
* @name
* @return Base
* @author :liyuhang
* @method
*/
public function formatQuery($map = []){
$query = $this;
$query->where(function ($query) use ($map,$val){
//拼接数据
if(is_array($map)){
foreach ($map as $v){
switch ($v){
case 'like':
// like查询 ['name|title', 'like', '%a%']
if (strpos($v[0], '|') !== false) {
$query->where(function ($query) use ($v) {
$item = explode('|', $v[0]);
foreach ($item as $vo) {
$query->orWhere($vo, $v[1], $v[2]);
}
});
} else {
$query->where($v[0], $v[1], $v[2]);
}
break;
case 'in':
// in查询 ['id', 'in', [1,2,3]]
if (!is_array($v[2])) {
$v[2] = explode(',', $v[2]);
}
$query->whereIn($v[0], $v[2]);
break;
case 'not in':
// not in查询 ['id', 'not in', [1,2,3]]
if (!is_array($v[2])) {
$v[2] = explode(',', $v[2]);
}
$query->whereNotIn($v[0], $v[2]);
break;
case 'between':
// between查询 ['created_at', 'between', ['xxx', 'xxx]]
if (!is_array($v[2])) {
$v[2] = explode(',', $v[2]);
}
$query->whereBetween($v[0], $v[2]);
break;
case 'not between':
// not between查询 ['created_at', 'not between', ['xxx', 'xxx]]
if (!is_array($v[2])) {
$v[2] = explode(',', $v[2]);
}
$query->whereNotBetween($v[0], $v[2]);
break;
case 'null':
// null查询 ['deleted_at', 'null']
$query->whereNull($v[0]);
break;
case "not null":
// not null查询 ['deleted_at', 'not null']
$query->whereNotNull($v[0]);
break;
case "or":
// or查询 [[['status'=>1],['status'=>2]], 'or'];
//格式:or (status=1 and status=2)
$where = $v[0];
$query->orWhere(function ($query) use ($where) {
// 递归解析查询条件
$this->formatQuery($where, $query);
});
break;
case 'xor':
// xor查询 [[['status'=>1],['status'=>2]], 'xor'];
// 格式:and (status=1 or status=2)
$where = $v[0];
$query->where(function ($query) use ($where) {
foreach ($where as $w) {
$query->orWhere(function ($query) use ($w) {
// 递归解析查询条件
$this->formatQuery([$w], $query);
$query->where(function ($query) use ($map){
foreach ($map as $k => $v){
if(is_array($v)){
//拼接数据
foreach ($v as $k1 => $v1){
switch ($k1){
case 'like':
// like查询 ['name|title'=> ['like','%a%']]
if (strpos($k, '|') !== false) {
$query->where(function ($query) use ($k,$v1) {
$item = explode('|', $k);
foreach ($item as $vo) {
$query->orWhere($vo, $v1[0], $v1[1]);
}
});
} else {
$query->where($k,$v1[0], $v1[1]);
}
});
break;
default:
// 常规查询
if (count($v) == 2) {
$query->where($v[0], '=', $v[1]);
} else {
$query->where($v[0], $v[1], $v[2]);
}
break;
break;
case 'in':
// in查询 ['id'=>['in'=>[1,2,3]]]
$query->whereIn($k, $v1[1]);
break;
case 'no in':
// in查询 ['id'=>['not in'=>[1,2,3]]]
$query->whereNotIn($k, $v1[1]);
break;
case 'between':
// in查询 ['id'=>['between'=>[create1,create2]]]
$query->whereBetween($k, $v1[1]);
case 'not between':
// not between查询 ['created_at'=>['not between'=>['xxx', 'xxx]]]
$query->whereNotBetween($k, $v1[1]);
break;
default:
$query->where($k,$k1,$v1[1]);
break;
}
}
}else{
$query->where($map,$val);
$query->where($k,$v);
}
}
});
return $query;
... ...