zoukankan      html  css  js  c++  java
  • thinkphp的where方法的使用

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

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

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

  • 相关阅读:
    Individual Method Selection Survey rubric
    Xcode 出现Thread 1: signal SIGABRT
    C/C++生成随机数
    《深入浅出深度学习:原理剖析与python实践》第八章前馈神经网络(笔记)
    操作系统--精髓与设计原理(第八版)第三章复习题答案
    操作系统--精髓与设计原理(第八版)第二章复习题答案
    Python知识点整理
    C++ <queue>用法
    C语言结构体用法
    Mac安装Qt出现错误Could not resolve SDK Path for 'macosx'
  • 原文地址:https://www.cnblogs.com/jingmin/p/6407144.html
Copyright © 2011-2022 走看看