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

作者:袖梨 2022-06-25

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查询条件汇总:

'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() 方法将数字字段值增加。

例子:

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() 方法将数字字段值减少。

例子:

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() 方法也支持连贯操作,从而可以构造更加复杂的更新条件。

相关文章

精彩推荐