连贯操做是 ThinkPHP 极富特点的一大特性,在使用连贯操做进行数据库操做时,就像玩游戏搭积木同样容易:嗯,程序编写就应该如此简洁而容易才对。数据库
连贯操做的一个例子:数组
$Dao = M("User"); // 查询全部用户数据 $allUser = $Dao->select(); // 查询最近注册的 10 个用户并按照注册时间排序 $newUser = $Dao->order('regdate DESC')->limit(10)->select();
上面查询最近 10 个注册用户的例子中,select、order 和 limit 都是 Model 的内置方法,分别表示数据查询、设置排序和查询记录限制。当把这些及更多的方法组合放在一块儿的时候从而构建不一样的数据库操做(包括 CURD 全部操做)时,这种操做方式就叫连贯操做。ui
连贯操做主方法是指对数据库的操做方法,例如 select(查询)、find(查询一条记录)、getBy动态方法、add(写入)、save(更新)、delect(删除)等。注意:主方法这一称谓并不是官方的称呼,而是本教材为了便于理解而定义的。spa
一个连贯操做中只容许出现一个主方法,且主方法必需要写在连贯操做的最后。本教程对各主方法分别作了详细介绍:对象
辅助方法即相对于上文的主方法而言,在连贯操做中辅助主方法实现各类数据库操做条件,如上面例子中的 where、limit 等方法。排序
where 方法用于设定操做条件,详细见:《ThinkPHP where方法》。教程
where 方法用于将查询结果排序,支持单个或多个字段排序,参数支持字符串和数组:索引
// 单个字段 $allUser = $Dao->order('uid DESC')->select(); // 多个字段 $allUser = $Dao->order('regdate ASC,score DESC')->select(); // 参数为数组 $allUser = $Dao->order(array('regdate'=>'ASC','score DESC'))->select();
limit 方法用于限制操做结果,对于不一样的数据库,ThinkPHP 将操做结果限制统一为 limit 方法,语法以下:游戏
limit('length')
若是使用 limit('10') 等效于 limit('0,10')。开发
定义要查询的字段,参数支持字符串和数组:
$allUser = $Dao->field('username,email')->select(); // 使用数组参数 $allUser = $Dao->field(array('nickname'=>'name','email'))->select();
若是不使用 field 方法指定查询字段,则等效为 field('*')。
用于新增或者保存数据以前的数据对象赋值:
$data['email'] = 'Jack@163.com'; $Dao->data($data)->where('id=3')->save(); // 若是不定义data方法赋值,则能够在主方法中传入参数或者使用create数据对象: $Dao->where('id=3')->save($data);
data 方法的参数支持对象和数组,若是是对象会自动转换成数组。
GROUP BY 语法支持,group 方法的参数只支持字符串:
$allUser = $Dao->group('regon')->select();
HAVING 语法支持,having 方法的参数只支持字符串:
$allUser = $Dao->having('score > 100')->select();
DISTINCT 语法支持,查询数据的时候进行惟一过滤:
$allUser = $Dao->distinct('username')->select();
JOIN 语法支持,具体参见《ThinkPHP JOIN查询》。
table 方法能够动态改变当前操做的数据表名称,须要写数据表的全名(包含前缀),可使用别名:
$allUser = $Dao->table('my_user')->select();
table 方法参数除字符串外还支持数组:
$allUser = $Dao->table(array('my_user'=>'user','my_group'=>'group'))->select();
使用数组方式能够避免由于表名和关键字冲突而出错的状况。若是不定义table方法,默认会自动获取当前模型对应或者定义的数据表。
page方法用于查询分页,具体参见《ThinkPHP 分页》。
lock 方法是用于数据库的锁机制:
$allUser = $Dao->lock(true)->select();
该例子会在生成的 SQL 语句最后加上 FOR UPDATE 。
与主方法不一样的是,上述这些辅助方法能够根据实际状况自由组合,且顺序没有先后要求。
连贯操做中各方法的参数仅在当次操做有效,完成后会自动清空连贯操做的全部传值,不会带入之后的操做中。
若是不使用连贯操做,ThinkPHP 还支持直接使用参数进行查询的方式。下面两个查询例子是等效的:
$newUser = $Dao->order('regdate DESC')->limit(10)->select(); $newUser = $Dao->select(array('order'=>'regdate DESC', 'limit'=>'10'));
如上例子所示,使用数组参数方式的话,索引的名称就是连贯操做的方法名称。
ThinkPHP 连贯操做有效的提升数据存取的代码清晰度和开发效率,建议积极使用。