Board logo

标题: ThinkPHP的连贯操作用法 [打印本页]

作者: fangzhen    时间: 2008-11-27 14:50     标题: ThinkPHP的连贯操作用法

ThinkPHP从1.0.3版本开始,增加了模型类的连贯操作支持,可以有效的提高数据存取的代码清晰度和开发效率。使用方面也比较简单,看下面的一个例子,
假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序
如果按照旧版的写法,我们的代码如下:
代码: 复制内容到剪贴板
$User->findAll('status=1','*','create_time',10);
如果使用连贯操作的话,代码改成:
代码: 复制内容到剪贴板
$User->where('status=1')->order('create_time')->limit(10)->findAll();
虽然看起来代码量增加了一些,但是很明显,代码清晰了很多,也不会混淆。
除了findAll方法必须放到最后一个外,其他的连贯操作的方法调用顺序没有先后,例如,下面的代码和上面的等效:
代码: 复制内容到剪贴板
$User->order('create_time')->where('status=1')->limit(10)->findAll();
是否连贯操作仅仅是为了不用在findAll方法里面写过多的参数和记住这些的顺序呢?事实上,并非如此,连贯操作虽然没有改变之前的方法调用,但是引入了一个更大的灵活性,以往的方式如果要在当前的模型里面操作其他的数据表的话,必须使用原生的SQL查询方法,因为findAll等查询方法是没有表名参数的,而是由系统自动获取当前模型对应的数据表,这样的做法是否合理,暂且不提,但是并不能保证没有这样的需求,我需要偶尔操作下其他的数据表,抑或其他的数据库,而连贯操作引入了一个table方法,可以轻松的改变当前操作的数据表名称,同样的例子,我们上面的查询要求查询另外一个数据库中的User表,我们把代码修改为:
代码: 复制内容到剪贴板
$User->where('status=1')->table('`other_db`.`think_user`')->order('create_time')->limit(10)->findAll();
当然,这只是举个例子,你还要保证你有相关的数据库的权限。
原则上说,连贯操作可以包含之前findall方法的所有参数,总结如下:
where 查询条件
table 数据表名称
field 要查询的字段名
order 排序
limit 结果限制
group group支持
having having支持
join join支持
cache 是否缓存查询结果
lazy 是否惰性查询
lock 是否锁查询
sql 直接写sql语句

连贯操作的最后查询方法除了findAll之外,还可以使用getN find topN 甚至包括save方法
例如:
代码: 复制内容到剪贴板
$User->where('id=1')->field('id,name,email')->find();

$User->where('status=1')->order('create_time')->top8();
作者: fangzhen    时间: 2008-11-27 15:35     标题: 多表操作

$User_relat    = D("User_relat");

        $Member =D("Member");        

        $User_relat->table('User_relat a')

        ->join(' Member  b on  a.up_id = b.userid ')

        ->field('a.*,b.*')

        ->order('up_id desc')

        ->findAll();
作者: fangzhen    时间: 2009-1-2 14:18

连贯操作时,table()指定的数据表区分大小写??




欢迎光临 PHP开发笔记 (http://phpvi.com/) Powered by Discuz! 6.1.0