利用“|”和“&”简化查询

1.多个字段相同查询条件下用“&”处理
例如该情况:
$model = M('Test');
$cond['T_StringA'] = 'test';
$cond['T_StringB'] = 'test';

$returnData = $model->where($cond)->select();

这样的写法下,查询条件最终的执行的sql是:

 SELECT * FROM `test` WHERE `T_StringA` = `test` AND `T_StringB` = `test`;

是直接将两个条件用“And”连接起来,返回最终数据是表数据中同时满足两个条件的值。
在条件较少,以及条件的内容较简单时,用这样的方法写起来的代码也不会很长,但如果你对代码长度有要求的话,用’&‘直接在查询条件的字段中拼接的话,就更为简便了。


例如该情况,查询字段较多时

$model = M('Test');
$cond['T_StringA'] = 'test';
$cond['T_StringB'] = 'test';
$cond['T_StringC'] = 'test';
$cond['T_StringD'] = 'test';     
 
$returnData = $model->where($cond)->select();

$cond 直接用一下写法就可。

 $cond['T_StringA&T_StringB&T_StringC&T_StringD'] = 'test';
 $returnData = $model->where($cond)->select();

这样的写法下,查询条件最终的执行的sql是:

SELECT * FROM `test` WHERE `T_StringA` = `test` AND `T_StringB` = `test` AND `T_StringC` = `test` AND `T_StringD` = `test`;

实际上和你想要的效果是一样的,只是说有需要的话,做个简单的处理,会少些一些代码。当然这样的场景应该也不会很多的。那如果是用在多表链接查询时,就不建议用该方法了,消耗太大。

但是如果你是想获取满足该条件中的一个的数据,那就得用"OR"


2.多个字段不相同查询条件下用“|”处理

 $model = M('Test');
     
 $cond['T_StringA'] = 'test';

 $cond['T_StringB'] = 'test';

 $cond['_logic'] = 'OR';
 $returnData = $model->where($cond)->select();
<br>

这样的写法下,查询条件最终的执行的sql是:

 SELECT * FROM `test` WHERE `T_StringA` = `test` OR `T_StringB` = `test`;

以前我还用过这样的方式拼接过,执行的sql时一样的啦,只是自己做的拼接,哈哈,不过是很low的啦。

$model = M('Test');
$cond['_string'] = ' T_StringA=\''.'test'.'\' OR T_StringB=\''.'test'.'\'';
$returnData = $model->where($cond)->select();

如下用“|”处理,会少几行代码了

$model = M('Test');
   
$cond['T_StringA'] = 'test';

$cond['T_StringB'] = 'test';

$cond['T_StringC'] = 'test';

$cond['T_StringD'] = 'test';      
$returnData = $model->where($cond)->select();

$cond 也是同上直接用一下写法就可。
$cond['T_StringA|T_StringB'] = 'test';

$returnData = $model->where($cond)->select(); 

3.其实 && 和 || 在PHP中很多场景都会用到,类似于做条件判断,就利用它们的原理来代替if判断,会简洁许多。

if ($test) {
  $cond['T_StringA'] = $test;
}

$test && $cond['T_StringA'] = $test;

顺便提一下,PHP 中 AND 和 OR ,&& 和 || 之间,本身代表的意思是没有区别的,但是有时候会涉及到运算符优先级。在网上看到一个例子如下: 因为赋值运算的优先级比AND和OR的高,所以先赋值;比&&和||的低,所以逻辑运算符先执行,先逻辑运算,再赋值。
<br>

$p = 6 or 0; 
var_dump($p);//int(6) 

$p = 6 || 0; 
var_dump($p);//bool(true) 

$p = 6 and 0; 
var_dump($p); //int(6)  

$p = 6 && 0; 
var_dump($p); //bool(false)