ThinkPHP开发指南-模型之连贯操作

来自站长百科
跳转至: 导航、​ 搜索

导航:上一页

ThinkPHP2.0版本全面启用模型类的连贯操作方法,可以有效的提高数据存取的代码清晰度和开发效率。使用方面也比较简单, 假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 ,代码如下:

PHP代码

$User->where('status=1')->order('create_time')->limit(10)->select(); 

除了select方法必须放到最后一个外,其他的连贯操作的方法调用顺序没有先后,例如,下面的代码和上面的等效:

PHP代码

$User->order('create_time')->where('status=1')->limit(10)->select();

如果不习惯使用连贯操作的话,新版还支持直接使用参数进行查询的方式。例如上面的代码可以改写为:

PHP代码

$User->select(array('order'=>'create_time', 'where'=>'status=1', 'limit'=>'10')); 

使用数组参数方式的话,索引的名称就是连贯操作的方法名称。其实不仅仅是查询方法可以使用连贯操作,包括add、 save、delete等方法都可以使用,例如:

PHP代码


$User->where('id=1')->field('id,name,email')->find();     

$User->where('status=1 and id=1')->delete();

原则上说,所有的连贯操作都只有一个参数,并且连贯操作的参数仅在当此查询或者操作有效,完成后会自动清空连贯操作的所有传值,简而言之,连贯操作的结果不会带入以后的查询。下面总结下连贯操作的使用方法(更多的用法我们会在CURD操作的过程中详细描述):

Where方法:用于查询或者更新条件的定义.

Where方法的参数支持字符串、数组和对象。详细的使用请参考后面的查询语言部分。

Table方法:定义要操作的数据表名称

可以动态改变当前操作的数据表名称,需要写数据表的全名,包含前缀,可以使用别名,例如:

PHP代码

$Model->Table('think_user user')->where('status>1')->select();   

Table方法的参数支持字符串和数组,数组方式的用法:

PHP代码

$Model->Table(array('think_user'=>'user','think_group'=>'group'))->where('status>1')->select();  

使用数组方式定义的优势是可以避免因为表名和关键字冲突而出错的情况。如果不定义table方法,默认会自动获取当前模型对应或者定义的数据表。

Data方法:数据对象赋值

可以用于新增或者保存数据之前的数据对象赋值,例如:

PHP代码

$Model->data($data)->add();    

$Model->data($data)->where('id=3')->save();

Data方法的参数支持对象数组,如果是对象会自动转换成数组。如果不定义data方法赋值,也可以使用create方法或者手动给数据对象赋值的方式。

Field方法:定义要查询的字段

Field方法的参数支持字符串和数组,例如,

PHP代码

$Model->field('id,nickname as name')->select();    

$Model->field(array('id','nickname'=>'name'))->select();

如果不使用field方法指定字段的话,默认和使用field('*')等效。

Order方法:结果排序 . 例如:

PHP代码

order('id desc') 

排序方法支持对多个字段的排序

PHP代码

order('status desc,id asc')

order方法的参数支持字符串和数组,数组的用法如下:

PHP代码

order(array('status'=>'desc','id')) 

Limit方法:结果限制

我们知道不同的数据库类型的limit用法是不尽相同的,但是在ThinkPHP的用法里面始终是统一的方法,也就是limit('offset,length') ,无论是MysqlSqlServer还是Oracle数据库,都是这样使用,系统的数据库驱动类会负责解决这个差异化。

例如

PHP代码

limit('1,10') 

如果使用limit('10') 等效于 limit('0,10')

Page方法:查询分页

Page操作方法是新增的特性,可以更加快速的进行分页查询。Page方法的用法和limit方法类似,格式为:

PHP代码

Page('page[,listRows]') 

Page表示当前的页数,listRows表示每页显示的记录数。例如:Page('2,10') 表示每页显示10条记录的情况下面,获取第2页的数据。listRow如果不写的话,会读取limit('length') 的值,例如:

PHP代码

limit(25)->page(3); 

表示每页显示25条记录的情况下面,获取第3页的数据。如果limit也没有设置的话,则默认为每页显示20条记录。

Group方法:查询Group支持 例如:group('user_id')

Group方法的参数只支持字符串

Having方法:查询Having支持 例如:

PHP代码

having('user_id>0'

having方法的参数只支持字符串

Join方法:查询Join支持

Join方法的参数支持字符串和数组,并且join方法是连贯操作中唯一可以多次调用的方法。例如:

PHP代码

$Model->join(' work ON artist.id = work.artist_id')->join('card ON artist.card_id = card.id')->select(); 

默认采用LEFT JOIN 方式,如果需要用其他的JOIN方式,可以改成

PHP代码

$Model->join('RIGHT JOIN work ON artist.id = work.artist_id')->select();

如果join方法的参数用数组的话,只能使用一次join方法,并且不能和字符串方式混合使用.

PHP代码

join(array(' work ON artist.id = work.artist_id','card ON artist.card_id = card.id'))

Distinct方法:查询的Disiinct支持

查询数据的时候进行唯一过滤

PHP代码

$Model->Distinct(true)->select();

Relation方法:关联查询支持

关联查询方法的详细用法请参考后面的关联模型部分。

Lock方法:查询锁定

Lock方法是用于数据库的锁机制,如果在查询或者执行操作的时候使用:

PHP代码

ck(true) 

就会自动在生成的SQL语句最后加上 FOR UPDATE。