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