ThinkPHP3.1快速入门(4)连贯操作
发布时间:2020-12-14 13:54:04 所属栏目:大数据 来源:网络整理
导读:上一篇我们详细描述了查询语言的用法,但是查询语言仅仅解决了查询或者操作条件的问题,更多的配合还需要使用模型提供的连贯操作方法。 介绍 连贯操作可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作,也是ThinkPHP的ORM中的一个亮点
上一篇我们详细描述了查询语言的用法,但是查询语言仅仅解决了查询或者操作条件的问题,更多的配合还需要使用模型提供的连贯操作方法。 介绍连贯操作可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作,也是ThinkPHP的ORM中的一个亮点。使用也比较简单, 假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 ,代码如下:$User->where('status=1')->order('create_time')->limit(10)->select(); 这里的where、order和limit方法就称之为连贯操作方法,除了select方法必须放到最后一个外(因为select方法并不是连贯操作方法),连贯操作的方法调用顺序没有先后,例如,下面的代码和上面的等效: $User->order('create_time')->limit(10)->where('status=1')->select(); 其实不仅仅是查询方法可以使用连贯操作,包括所有的CURD方法都可以使用,例如: $User->where('id=1')->field('id,name,email')->find(); 连贯操作仅在当次查询或者操作有效,完成后会自动清空连贯操作的所有传值(有个别特殊的连贯操作会记录当前的传值,如cache连贯操作)。简而言之,连贯操作的结果不会带入以后的查询。$User->where('status=1 and id=1')->delete(); 系统支持的连贯操作方法有:
用法由于连贯操作的使用往往涉及到多个方法的联合使用,下面大概介绍下各个连贯操作的基本用法:WHERE
TABLE
$Model->Table('think_user user')->where('status>1')->select(); 也可以在table方法中跨库操作,例如:$Model->Table('db_name.think_user user')->where('status>1')->select(); Table方法的参数支持字符串和数组,数组方式的用法:$Model->Table(array('think_user'=>'user','think_group'=>'group'))->where('status>1')->select(); 使用数组方式定义的优势是可以避免因为表名和关键字冲突而出错的情况。一般情况下,无需调用table方法,默认会自动获取当前模型对应或者定义的数据表。 DATA
$Model->data($data)->add(); Data方法的参数支持对象和数组,如果是对象会自动转换成数组。如果不定义data方法赋值,也可以使用create方法或者手动给数据对象赋值的方式。$Model->data($data)->where('id=3')->save(); 模型的data方法除了创建数据对象之外,还可以读取当前的数据对象, 例如: $this->find(3); $data = $this->data(); FIELD
$Model->field('id,nickname as name')->select(); 如果不调用field方法或者field方法传入参数为空的话,和使用field('*')是等效的。$Model->field(array('id','nickname'=>'name'))->select(); 如果需要显式的传入所有的字段,可以使用下面的方法: $Model->field(true)->select(); 但是我们更建议只获取需要显式的字段名,或者采用字段排除方式来定义,例如:$Model->field('status',true)->select(); 表示获取除了status之外的所有字段。ORDER
order('id desc') 排序方法支持对多个字段的排序order('status desc,id asc') order方法的参数支持字符串和数组,数组的用法如下:order(array('status'=>'desc','id')) LIMIT
我们知道不同的数据库类型的limit用法是不尽相同的,但是在ThinkPHP的用法里面始终是统一的方法,也就是limit('offset,length') ,无论是Mysql、SqlServer还是Oracle数据库,都是这样使用,系统的数据库驱动类会负责解决这个差异化。 使用示例: limit('1,10') 也可以用下面的两个参数的写法,是等效的:limit(1,10) 如果使用limit('10') 等效于 limit('0,10') PAGE
Page方法的用法和limit方法类似,格式为: Page('page[,listRows]') Page表示当前的页数,listRows表示每页显示的记录数。例如:Page('2,10') 表示每页显示10条记录的情况下面,获取第2页的数据。listRow如果不写的话,会读取limit('length') 的值,例如: limit(25)->page(3); 表示每页显示25条记录的情况下面,获取第3页的数据。如果limit也没有设置的话,则默认为每页显示20条记录。 page方法也支持传入二个参数,例如: $this->page(5,25)->select(); 和之前的用法$this->page('5,25')->select(); 等效。GROUP
group('user_id') Group方法的参数只支持字符串HAVING
having('user_id>0') having方法的参数只支持字符串JOIN
$Model->join(' work ON artist.id = work.artist_id')->join('card ON artist.card_id = card.id')->select(); 默认采用LEFT JOIN 方式,如果需要用其他的JOIN方式,可以改成$Model->join('RIGHT JOIN work ON artist.id = work.artist_id')->select(); 如果join方法的参数用数组的话,只能使用一次join方法,并且不能和字符串方式混合使用。例如: join(array(' work ON artist.id = work.artist_id','card ON artist.card_id = card.id')) UNION
$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(); $Model->field('name') 支持UNION ALL 操作,例如:->table('think_user_0') ->union(array('SELECT name FROM think_user_1','SELECT name FROM think_user_2')) ->select(); $Model->field('name') 或者->table('think_user_0') ->union('SELECT name FROM think_user_1',true) ->union('SELECT name FROM think_user_2',true) ->select(); $Model->field('name') 每个union方法相当于一个独立的SELECT语句。->table('think_user_0') ->union(array('SELECT name FROM think_user_1','SELECT name FROM think_user_2'),true) ->select(); 注意:UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。 DISTINCT
$Model->Distinct(true)->field('name')->select(); LOCK
lock(true) 就会自动在生成的SQL语句最后加上 FOR UPDATE或者FOR UPDATE NOWAIT(Oracle数据库)。VALIDATE
AUTO
SCOPE
FILTER
$Model->data($data)->filter('strip_tags')->add(); 目前filter方法不支持多个方法的过滤。总结连贯操作为我们的数据操作带来了很大的便捷之处,并且只要SQL可以实现的操作,基本上都可以用ThinkPHP的连贯操作来实现,并且不用考虑数据库之间的表达差异,具有可移植性。后面会和大家讲解如何操作和获取变量。(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |