1.Thinkphp中where()条件的使用

  总是有人觉得,thinkphp的where()就是写我要进行增加、查询、修改、删除数据的条件,很简单的,其实我想告诉你,where()是写条件语句的,但是他很不简单,严密的条件语句,可以有效的防止sql注入,也可以加强sql语句的严密性,也有利于进行搜索查询

 

  1.1查询方法分类

  where方法的用法是ThinkPHP查询语言的精髓,可以完成包括普通查询、表达式查询、快捷查询、区间查询、组合查询在内的查询操作。where方法的参数支持字符串数组,虽然也可以使用对象但并不建议。

 

  1.1.1字符串条件

  使用字符串条件直接查询和操作(TP框架控制器中的条件语句可以在/Runtime/Logs/.. 里面找到,可以对比)

  例:

 

       $User = M("User"); // 实例化User对象
       $User->where(\'type=1 AND status=1\')->select();

 

 

 

  生成sql语句:SELECT * FROM user WHERE type=1 AND status=1;

  

  在TP版本3.1以上时,建议配合预处理机制,确保更加安全,可以有效的防sql注入

    $Model->where("id=%d and username=\'%s\' and xx=\'%f\'",array($id,$username,$xx))->select();

或者: $Model->where("id=%d and username=\'%s\' and xx=\'%f\'",$id,$username,$xx)->select();

 

 

 

 

  1.1.2数组条件

  最简单的数组条件查询:

  $User = M(“User”); // 实例化User对象
      $map[\’name\’] = \’thinkphp\’;
      $map[\’status\’] = 1;
      // 把查询条件传入查询方法
      $User->where($map)->select();

  生成的SQL语句:SELECT * FROM user WHERE `name`=\’thinkphp\’ AND status=1

  

  1.1.3表达式查询

  $map[\’字段1\’]  = array(\’表达式\’,\’查询条件1\’);
      $map[\’字段2\’]  = array(\’表达式\’,\’查询条件2\’);
      $Model->where($map)->select();

  

  1.1.4表达式中运算符条件的查询

  TP运算符

  SQL运算符 例子 实际查询条件
eq = $map[\’id\’] = array(\’eq\’,100); 等效于:$map[\’id\’] = 100;
neq != $map[\’id\’] = array(\’neq\’,100); id != 100
gt > $map[\’id\’] = array(\’gt\’,100); id > 100
egt >= $map[\’id\’] = array(\’egt\’,100); id >= 100
lt < $map[\’id\’] = array(\’lt\’,100); id < 100
elt <= $map[\’id\’] = array(\’elt\’,100); id <= 100
like like $map<\’username\’> = array(\’like\’,\’Admin%\’); username like \’Admin%\’
between between and $map[\’id\’] = array(\’between\’,\’1,8\’); id BETWEEN 1 AND 8
not between not between and $map[\’id\’] = array(\’not between\’,\’1,8\’); id NOT BETWEEN 1 AND 8
in in $map[\’id\’] = array(\’in\’,\’1,5,8\’); id in(1,5,8)
not in not in $map[\’id\’] = array(\’not in\’,\’1,5,8\’); id not in(1,5,8)
and(默认) and $map[\’id\’] = array(array(\’gt\’,1),array(\’lt\’,10)); (id > 1) AND (id < 10)
or or $map[\’id\’] = array(array(\’gt\’,3),array(\’lt\’,10), \’or\’); (id > 3) OR (id < 10)
xor(异或) xor 两个输入中只有一个是true时,结果为true,否则为false,例子略。 1 xor 1 = 0
exp 综合表达式 $map[\’id\’] = array(\’exp\’,\’in(1,3,8)\’); $map[\’id\’] = array(\’in\’,\’1,3,8\’);

 

    exp 不是一个运算符,而是一个综合表达式以支持更复杂的条件设置。exp 的操作条件不会被当成字符串,可以使用任何 SQL 支持的语法,包括使用函数和字段名称

    

    1.1.5快捷查询

 

   一、实现不同字段相同的查询条件

  $User = M(“User”); // 实例化User对象
      $map[\’name|title\’] = \’thinkphp\’;
      // 把查询条件传入查询方法
      $User->where($map)->select(); 

  查询条件就变成 name= \’thinkphp\’ OR title = \’thinkphp\’,是不是很强大

  

  二、实现不同字段不同的查询条件

  $User = M(“User”); // 实例化User对象
      $map[\’status&title\’] =array(\’1\’,\’thinkphp\’,\’_multi\’=>true);
      // 把查询条件传入查询方法
      $User->where($map)->select(); 

  \’_multi\’=>true必须加在数组的最后,表示当前是多条件匹配,这样查询条件就变成 status= 1 AND title = \’thinkphp\’ ,查询字段还能支持更多。

  例:$map[\’status&score&title\’] =array(\’1\’,array(\’gt\’,\’0\’),\’thinkphp\’,\’_multi\’=>true);
    查询条件就变成 status= 1 AND score >0 AND title = \’thinkphp\’

    注意:快捷查询方式中“|”和“&”不能同时使用。

  

  三、区间查询

    where方法支持对某个字段的区间查询,例如:
       $map[\’id\’] = array(array(\’gt\’,1),array(\’lt\’,10)) ;

     得到的查询条件是: (`id` > 1) AND (`id` < 10)

  

    $map[\’id\’] = array(array(\’gt\’,3),array(\’lt\’,10), \’or\’) ;
    得到的查询条件是: (`id` > 3) OR (`id` < 10)

  

    区间查询的条件可以支持普通查询的所有表达式,也就是说类似LIKE、GT和EXP这样的表达式都可以支持。另外区间查询还可以支持更多的条件,只要是针对一个字段的条件都可以写到一起。

    例:$map[\’name\’]  = array(array(\’like\’,\’%a%\’), array(\’like\’,\’%b%\’), array(\’like\’,\’%c%\’), \’ThinkPHP\’,\’or\’); 
    最后的查询条件是:(`name` LIKE \’%a%\’) OR (`name` LIKE \’%b%\’) OR (`name` LIKE \’%c%\’) OR (`name` = \’ThinkPHP\’)

 

    1.1.6组合查询(这是项目中最常用到,并且很重要的一个查询方式)

    一、字符串模式查询(采用_string 作为查询条件)
    数组条件还可以和字符串条件混合使用,例如:

      $User = M(“User”); // 实例化User对象
      $map[\’id\’] = array(\’neq\’,1);
      $map[\’name\’] = \’ok\’;
      $map[\’_string\’] = \’status=1 AND score>10\’;
      $User->where($map)->select(); 

    最后得到的查询条件就成了:( `id` != 1 ) AND ( `name` = \’ok\’ ) AND ( status=1 AND score>10 )

 

    二、请求字符串查询方式
    请求字符串查询是一种类似于URL传参的方式,可以支持简单的条件相等判断。
        $map[\’id\’] = array(\’gt\’,\’100\’);
        $map[\’_query\’] = \’status=1&score=100&_logic=or\’;

       得到的查询条件是:`id`>100 AND (`status` = \’1\’ OR `score` = \’100\’)

    

    三、复合查询

    复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。
    例如:
        $where[\’name\’]  = array(\’like\’, \’%thinkphp%\’);
        $where[\’title\’]  = array(\’like\’,\’%thinkphp%\’);
        $where[\’_logic\’] = \’or\’;
        $map[\’_complex\’] = $where;
        $map[\’id\’]  = array(\’gt\’,1);

     查询条件是:( id > 1) AND ( ( name like \’%thinkphp%\’) OR ( title like \’%thinkphp%\’) )

      复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。(当你掌握到这种程度,说明你的where()条件的使用快没有问题了

 

    1.1.7多次调用

    where方法支持多次调用,但字符串条件只能出现一次。

    $map[\’a\’] = array(\’gt\’,1);
        $where[\’b\’] = 1;
        $Model->where($map)->where($where)->where(\’status=1\’)->select();

    多次的数组条件表达式会最终合并,但字符串条件则只支持一次。

 

    总结了这么多,是不是感觉有些用法自己也用过呢?感觉写的还可以,点个赞

版权声明:本文为jingmin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jingmin/p/6407144.html