首页>>技术分享>>php杂谈>ThinkPHP5框架where和whereor大量混合写如何区分

ThinkPHP5框架where和whereor大量混合写如何区分

大路 php杂谈 2023-11-22 434

在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();

皆可生成

  1. seelecT table  FROM `table` WHERE  (  `key1` = 'value' OR `key1` = 'value1' ) and  `key2` = 'value2'

  2. 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);


标签: