ThinkPHP 3.2.2 框架的模型中where查询条件总结

ThinkPHP_3.2.3 框架的Model,结合官方手册及使用经验汇总出其大体用法:

核心转换方法:

    $this->parseWhere($where);
    $whereStr .= $this->parseThinkWhere($key, $val);
    $this->parseWhereItem($this->parseKey($key), $val);

    // 内连接、左连接、右连接 UserModel.class.php
    // SQL:( SELECT * FROM sg_user u LEFT JOIN sg_user_field uf on u.userId=uf.userId WHERE ( u.userId = 1 ) )
    $list = $this->alias('u')->join('__USER_FIELD__ uf on u.userId=uf.userId', 'LEFT')->where($where)->buildSql();
    $list = $this->table('__USER__ u')->join('__USER_FIELD__ uf on u.userId=uf.userId', 'LEFT')->where($where)->buildSql();

单词缩写:

    e(=):equal  ;   n:not  ;  gt(>):greater than  ;  lt(<):lower than

where查询条件汇总:

<!--?php
$where = array(
    '_logic' =--> 'and', 'or', 'xor',
    array( // 注:跟 '_complex' 功能一样
        'name' => '名称',
        'title' => '标题'
    ),
    '_complex' => array(
        'name' => '名称',
        'title' => '标题'
    ),
    '_string' => "name='blog.snsgou.com' AND title='snsgou'",
    '_query' => "_logic=AND&name=blog.snsgou.com&title=snsgou",

    //-------------------------------------------------

    'name|title|nickname' => '名称',
    'name|title|nickname' => array(
        '_multi' => 1,
        '名称',
        '标题',
        '昵称'
    ),
    'name&title&nickname' => '名称',
    'name&title&nickname' => array(
        '_multi' => 1,
        '名称',
        '标题',
        '昵称'
    ),

    //-------------------------------------------------

    'name' => 'blog.snsgou.com',

    // 表达式查询
    'name' => array('like', 'blog.snsgou.com%'),
    'name' => array('like', array('%blog.snsgou.com%', '%sg'), 'or'),

    'name' => array('notlike', 'blog.snsgou.com%'),
    'name' => array('notlike', array('%blog.snsgou.com%', '%sg'), 'or'),

    'id' => array('eq|neq|gt|egt|lt|elt', 28),

    'id' => array('exp', 'IN (2,3,4)'),

    'id' => array('in|not in', '(2,3,4)', 'exp'),
    'id' => array('in|not in', '2,3,4'),
    'id' => array('in|not in', array(2,3,4)),

    'id' => array('between', '1,8'),
    'id' => array('between', array(1,8)),

    // 区间查询
    'id' => array(array('neq', 6), array('gt', 3), 'and'),
    'id' => array(array('neq', 6), array('gt', 3), array('and')),
    'id' => array(array('exp', 'in(2,3,4)'), array('gt', 3), 'and'),
);
 

Where 条件中使用表达式

这里说的表达式,是指 ThinkPHP 框架中特有的表达式。这些表达式用于查询或更新删除等操作的 where条件 及模板标签中。

Where 条件表达式格式为:

    $map['字段名']  = array('表达式', '操作条件');

其中 $map 是一个普通的数组变量,可以根据自己需求而命名。上述格式中的表达式实际是运算符的意义:

ThinkPHP运算符 与 SQL运算符 对照表

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

MySQL WHERE 条件

WHERE 条件

有时候操作数据库时,只操作一些有条件限制的数据,这时可以在SQL语句中添加WHERE子句来规定数据操作的条件。

语法:

    SELECT column,… FROM tb_name WHERE definition

WHERE 关键字后面接有效的表达式(definition),该表达式表示被操作的数据记录必须满足的条件。

除 SELECT 外,WHERE 条件关键字可以用于任何 SQL 语法允许的场合,如 UPDATE(更新)、DELETE(删除)等。

例子:

    SELECT * FROM user WHERE username = 'Jack'

该例子指定查询条件为 username 等于 Jack 的数据。

WHERE 表达式中运算符说明:

参数说明:

运算符 说明
= 等于
!= 不等于,某些数据库系统也写作 <>
> 大于
< 小于
>= 大于或等于
<= 小于或等于
BETWEEN … AND … 介于某个范围之内,例:WHERE age BETWEEN 20 AND 30
NOT BETWEEN …AND … 不在某个范围之内
IN(项1,项2,…) 在指定项内,例:WHERE city IN('beijing','shanghai')
NOT IN(项1,项2,…) 不在指定项内
LIKE 搜索匹配,常与模式匹配符配合使用
NOT LIKE LIKE的反义
IS NULL 空值判断符
IS NOT NULL 非空判断符
NOT、AND、OR 逻辑运算符,分别表示否、并且、或,用于多个逻辑连接。
优先级:NOT > AND > OR
% 模式匹配符,表示任意字串,例:WHERE username LIKE '%user'

一些 WHERE 例子

根据用户名查询指定用户:

    SELECT * FROM user WHERE username = 'Jack'

查询2009年1月1日凌晨0点以后注册的用户名称及 id 号:

    $regdate = mktime(00, 00, 01, 01, 01, 2009);

    SELECT uid,username FROM user WHERE regdate >= $regdate

搜索用户名中含有 user 字样的所有用户:

    SELECT * FROM user WHERE username LIKE '%user%'

搜索用户名中含有 user 或者 admin 的所有用户:

    SELECT * FROM user WHERE username LIKE '%user%' OR username LIKE '%admin%'

补充说明

    同 SQL 一样,ThinkPHP运算符不区分大小写,eq 与 EQ 一样。
    between、 in 条件支持字符串或者数组,即下面两种写法是等效的:

$map['id']  = array('not in','1,5,8');
$map['id']  = array('not in',array('1','5','8'));

exp 表达式

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

$Dao = M("Article");

// 构建 save 的数据数组,文章点击数+1
$data['aid'] = 10;
$data['counter'] = array('exp','counter+1');

// 根据条件保存修改的数据
$User->save($data);
 

 

注:对于数字字段的加减,可以直接使用 ThinkPHP setInc 与 setDec 方法。

ThinkPHP 内置了对统计数据(数字字段)的更新方法:

    setInc():将数字字段值增加

    setDec():将数字字段值减少

setInc()

ThinkPHP setInc() 方法将数字字段值增加。

例子:

<!--?php
public function update()
{
    header("Content-Type:text/html; charset=utf-8");
    $Dao = M("User");
    $result = $Dao--->where('uid = 2')->setInc('score', 3);
    if ($result !== false)
    {
        echo '数据更新成功!';
    }
    else
    {
        echo '没更新任何数据!';
    }
}

上面例子执行的 SQL 语句为:

    UPDATE user SET score=score+3 WHERE uid = 2

setInc() 方法中最后一个参数为数字字段增加的值,如果省略则默认增加 1 。

 

setDec()

ThinkPHP setDec() 方法将数字字段值减少。

例子:

<!--?php
public function update()
{
    header("Content-Type:text/html; charset=utf-8");
    $Dao = M("User");
    $result = $Dao--->where('uid = 2')->setDec('score', 3);
    if ($result !== false)
    {
        echo '数据更新成功!';
    }
    else
    {
        echo '没更新任何数据!';
    }
}

上面例子执行的 SQL 语句为:

    UPDATE user SET score=score-3 WHERE uid = 2

setDec() 方法中最后一个参数为数字字段减少的值,如果省略则默认减少 1 。

 

提示

在 ThinkPHP 3.0 版本中,setInc() 与 setDec() 方法取消了条件参数,因此必须配合 where 方法一起使用。setInc() 与 setDec() 方法也支持连贯操作,从而可以构造更加复杂的更新条件。

时间: 2024-09-20 11:06:07

ThinkPHP 3.2.2 框架的模型中where查询条件总结的相关文章

hibernate中带查询条件的分页

所谓分页,从数据库中分,则是封装一个分页类.利用分页对象进行分页. 但,分页往往带查询条件.   分页类的三个重要数据:[当前页码数],[数据库中的总记录数],[每页显示的数据的条数] 原理:select * from  [表名] where   [字段名]  like   ['%条件%']    limit  [开始查询的索引],[每页显示的数据]   带查询条件的分页分两步 (1)第一步:查询出符合条件的数据的总条数  ---->select count(*) from [表名] where

jsp-JSP如何从输入框中获取查询条件,在后台查询

问题描述 JSP如何从输入框中获取查询条件,在后台查询 一个JSP有个输入框,点击提交,怎么获取到这个输入框的值,写在后台的WHERE字段中作为查询条件,求教~~~ 解决方案 把输入框放在FORM 中 ,点击提交按钮 在Servlet 中通过HttpServletRequest.getParameter('输入框的NAME') 即可.

JSP如何从复选框中获取查询条件,在后台查询

问题描述 JSP如何从复选框中获取查询条件,在后台查询 如何进行车型的查询,默认value值

ThinkPHP 分页中带入查询(搜索)条件

很多情况下,分页还会带入查询条件,而这时查询往往是不固定的.例如常见的搜索,需要根据用户查询的关键字来进行检索,在搜索结果太多时,就需要将搜索结果进行合理分页. ThinkPHP 分页可以很容易的实现对不固定查询参数的支持.具体实现是给分页类的 parameter 属性赋值或者直接实例化分页类时传入查询参数.下面以例子来说明. parameter 属性赋值 例如要检索用户表中状态为 1 (status=1) 并且电子包含 163 的用户,当提交表单时(注意表单是 GET 方式提交),形成的 UR

thinkphp在模型中自动完成session赋值示例代码

  相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比如自动验证.自动完成等,今天在开发中遇到自动完成中需要获取session值然后自动赋值的功能,具体看代码; 01class ArticlelModel extends Model { 02 03protected $_auto = array ( 04array('addtime','time',1,'function'), 05array('username','getName',1,'callback')

thinkphp在模型中自动完成session赋值示例代码_php技巧

相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比如自动验证.自动完成等,今天在开发中遇到自动完成中需要获取session值然后自动赋值的功能,具体看代码: class ArticlelModel extends Model { protected $_auto = array ( array('addtime','time',1,'function'), array('username','getName',1,'callback') ); //这个函数获取se

thinkphp 模板系统-thinkphp框架+模板 html中的{abc:$Think.session.uname}定义是什么意思?

问题描述 thinkphp框架+模板 html中的{abc:$Think.session.uname}定义是什么意思? 在html模板的html中有以下定义: {abc:$Think.session.uname} {}大括号中的abc能修改吗?在哪里定义的?

如何让thinkphp在模型中自动完成session赋值小教程_php技巧

相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比如自动验证.自动完成等,今天在开发中遇到自动完成中需要获取session值 然后自动赋值的功能,具体看代码: class ArticlelModel extends Model { protected $_auto = array ( array('addtime','time',1,'function'), array('username','getName',1,'callback') ); //这个函数获取s

ThinkPHP中关联查询实例_php实例

本文实例讲述了ThinkPHP中关联查询的用法.分享给大家供大家参考.具体分析如下: 在THINKPHP中关联查询(多表查询)可以使用 table() 方法或和join方法,如下示例所示: 1.table() 复制代码 代码如下: $list = $user->table('user_status stats, user_profile profile')->where('stats.id = profile.typeid')->field('stats.id as id, stats.