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