ThinkPHP5框架where和whereor大量混合写如何区分
在thinkphp5 钟->where->whereOr混在一起写会产生很奇怪的逻辑,特别是大量的where和whereor混合时,没法区分到底哪个是where和哪个where会是一组,所以为了区分,产生以下写法我认为是合理的
tp5中采用闭包的方式: $map['user_id']=1; $map['status']=0; $or_map['user_id']=$map['user_id']; $or_map['audit']=['in',['1,2']]; $list = Db::name('table')->where(function ($query) use ($map) { $query->where($map); })->whereOr(function ($query) use ($or_map) { $query->where($or_map); })->select(); //生成的sql语句: //SELECT * FROM `tp_table` WHERE ( `user_id` = '1' AND `status` = 0 ) OR ( `user_id` = '1' AND `audit` IN ('1,2') )
thinkphp5的闭包比较奇怪,必须在function里面进行use才可以使用外面的变量,$query代表where自身生成一个解析函数,但是是匿名的,所以是闭包
当内部使用or的时候
$data = db('table')->where(function($query) { $query->where('key1', value)->whereor('key1',value1); })->where(['key2'=>value2,'key3'=>value3])->field('key4')->find();
皆可生成
seelecT table FROM `table` WHERE ( `key1` = 'value' OR `key1` = 'value1' ) and `key2` = 'value2'
and 'key3' = 'value3';
混合查询
$result = Db::table('think_user')->where(function ($query) { $query->where('id', 1)->whereor('id', 2); })->whereOr(function ($query) { $query->where('name', 'like', 'think')->whereOr('name', 'like', 'thinkphp'); })->select();
传参使用
$map = ['status'=>1,'admin_id'=>5]; $orMap = ['type'=>1,'step'=>2]; $list = Db::name('tb')->where(function ($query) use ($map) { $query->where($map); })->whereOr(function ($query) use ($orMap) { $query->where($orMap); })->order('id desc')->select(); // 生成的sql为:select * from `tb` where (`status`=1 and `admin_id`=5) or (`type`=1 and `step`=2);