系统支持的连贯操作方法有:
连贯操作 | 作用 | 支持的参数类型 |
---|---|---|
where* | 用于查询或者更新条件的定义 | 字符串、数组和对象 |
table | 用于定义要操作的数据表名称 | 字符串和数组 |
alias | 用于给当前数据表定义别名 | 字符串 |
data | 用于新增或者更新数据之前的数据对象赋值 | 数组和对象 |
field | 用于定义要查询的字段(支持字段排除) | 字符串和数组 |
order | 用于对结果排序 | 字符串和数组 |
limit | 用于限制查询结果数量 | 字符串和数字 |
page | 用于查询分页(内部会转换成limit) | 字符串和数字 |
group | 用于对查询的group支持 | 字符串 |
having | 用于对查询的having支持 | 字符串 |
join* | 用于对查询的join支持 | 字符串和数组 |
union* | 用于对查询的union支持 | 字符串、数组和对象 |
distinct | 用于查询的distinct支持 | 布尔值 |
lock | 用于数据库的锁机制 | 布尔值 |
cache | 用于查询缓存 | 支持多个参数 |
relation | 用于关联查询(需要关联模型支持) | 字符串 |
result | 用于返回数据转换 | 字符串 |
validate | 用于数据自动验证 | 数组 |
auto | 用于数据自动完成 | 数组 |
filter | 用于数据过滤 | 字符串 |
scope* | 用于命名范围 | 字符串、数组 |
bind* | 用于数据绑定操作 | 数组或多个参数 |
token | 用于令牌验证 | 布尔值 |
comment | 用于SQL注释 | 字符串 |
index | 用于数据集的强制索引(3.2.3新增) | 字符串 |
strict | 用于数据入库的严格检测(3.2.3新增) | 布尔值 |
WHERE查询
字符串条件:
$User->where('type=1 AND status=1')->select();
数组条件:
$User = M("User"); // 实例化User对象
$map['name'] = 'thinkphp';
$map['status'] = 1;
// 把查询条件传入查询方法
$User->where($map)->select();
表达式条件:
$map['字段1'] = array('表达式','查询条件1');
$map['字段2'] = array('表达式','查询条件2');
$Model->where($map)->select();
表达式 | 含义 |
---|---|
EQ | 等于(=) |
NEQ | 不等于(<>) |
GT | 大于(>) |
EGT | 大于等于(>=) |
LT | 小于(<) |
ELT | 小于等于(<=) |
LIKE | 模糊查询 |
[NOT] BETWEEN | (不在)区间查询 |
[NOT] IN | (不在)IN 查询 |
EXP | 表达式查询,支持SQL语法 |
多次调用
$map['a'] = array('gt',1);
$where['b'] = 1;
$Model->where($map)->where($where)->where('status=1')->select();
DATA(写入)
$Model = M('User');
$data['name'] = '流年';
$data['email'] = 'thinkphp@qq.com';
$Model->data($data)->add();
data方法支持数组、对象和字符串,对象方式如下:
$Model = M('User');
$obj = new \stdClass;
$obj->name = '流年';
$obj->email = 'thinkphp@qq.com';
$Model->data($obj)->add();
字符串方式用法如下:
$Model = M('User');
$data = 'name=流年&email=thinkphp@qq.com';
$Model->data($data)->add();
也可以直接在add方法中传入数据对象来新增数据,例如:
$Model = M('User');
$data['name'] = '流年';
$data['email'] = 'thinkphp@qq.com';
$Model->add($data);
DATA(读取)
$User = M('User');
$map['name'] = '流年';
$User->where($map)->find();
// 读取当前数据对象
$data = $User->data();
FIELD
$Model->field('id,title,content')->select();
ORDER
$Model->where('status=1')->order('id desc')->limit(5)->select();
支持对多个字段的排序,例如:
$Model->where('status=1')->order('id desc,status')->limit(5)->select();
LIMIT
例如获取满足要求的10个用户,如下调用即可:
$User = M('User');
$User->where('status=1')->field('id,name')->limit(10)->select();
limit方法也可以用于写操作,例如更新满足要求的3条数据:
$User = M('User');
$User->where('score=100')->limit(3)->save(array('level'=>'A'));
分页查询
用于文章分页查询是limit方法比较常用的场合,例如:
$Article = M('Article');
$Article->limit('10,25')->select();
PAGE
$Article = M('Article');
$Article->page('1,10')->select(); // 查询第一页数据
$Article->page('2,10')->select(); // 查询第二页数据
GROUP
$this->field('user_id,username,max(score)')->group('user_id')->select();
也支持对多个字段进行分组,例如:
$this->field('user_id,test_time,username,max(score)')->group('user_id,test_time')->select();
HAVING
用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据。
$this->field('username,max(score)')->group('user_id')->having('count(test_time)>3')->select();
JOIN
- INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
$Model = M('Artist');
$Model
->join('think_work ON think_artist.id = think_work.artist_id')
->join('think_card ON think_artist.card_id = think_card.id')
->select();
$Model->join('__WORK__ ON __ARTIST__.id = __WORK__.artist_id','RIGHT')->select();
UNION
用于合并两个或多个 SELECT 语句的结果集。
$Model->field('name')
->table('think_user_0')
->union('SELECT name FROM think_user_1')
->union('SELECT name FROM think_user_2')
->select();
数组用法:
$Model->field('name')
->table('think_user_0')
->union(array('field'=>'name','table'=>'think_user_1'))
->union(array('field'=>'name','table'=>'think_user_2'))
->select();
支持UNION ALL 操作,例如:
$Model->field('name')
->table('think_user_0')
->union('SELECT name FROM think_user_1',true)
->union('SELECT name FROM think_user_2',true)
->select();
DISTINCT
去重
$Model->distinct(true)->field('name')->select();
fetchSql
用于直接返回SQL而不是执行查询,适用于任何的CURD操作方法。 例如:
$result = M('User')->fetchSql(true)->find(1);
输出result结果为: SELECT * FROM think_user where id = 1
TOKEN
用于临时关闭令牌验证,例如:
$model->token(false)->create();
STRICT
strict为3.2.3新增连贯操作,用于设置数据写入和查询是否严格检查是否存在字段。默认情况下不合法数据字段自动删除,如果设置了严格检查则会抛出异常。 例如:
$model->strict(true)->add($data);
命名范围(查询范围)
要使用命名范围功能,主要涉及到模型类的_scope
属性定义和scope
连贯操作方法的使用。
namespace Home\Model;
use Think\Model;
class NewsModel extends Model {
protected $_scope = array(
// 命名范围normal
'normal'=>array(
'where'=>array('status'=>1),
),
// 命名范围latest
'latest'=>array(
'order'=>'create_time DESC',
'limit'=>10,
),
);
}
命名范围支持的属性包括:
属性 | 描述 |
---|---|
where | 查询条件 |
field | 查询字段 |
order | 结果排序 |
table | 查询表名 |
limit | 结果限制 |
page | 结果分页 |
having | having查询 |
group | group查询 |
lock | 查询锁定 |
distinct | 唯一查询 |
cache | 查询缓存 |
每个命名范围的定义可以包括这些属性中一个或者多个。
最简单的调用方式就直接调用某个命名范围,例如:
$Model = D('News'); // 这里必须使用D方法 因为命名范围在模型里面定义
$Model->scope('normal')->select();
$Model->scope('latest')->select();
生成的SQL语句分别是:
SELECT * FROM think_news WHERE status=1
SELECT * FROM think_news ORDER BY create_time DESC LIMIT 10
支持同时调用多个命名范围定义,例如:
$Model->scope('normal')->scope('latest')->select();
或者简化为:
$Model->scope('normal,latest')->select();
$Model->scope('normal')->limit(8)->order('id desc')->select();
这样,生成的SQL变成:
SELECT id,title FROM think_news WHERE status=1 ORDER BY id desc LIMIT 8
如果定义的命名范围和连贯操作的属性有冲突,则后面调用的会覆盖前面的。