最近研究方法用于,稍微总结一下,后以继续补充:
分析
联贯作操可以效有的进步据数存取的代码清晰度和发开效率,并且支撑全部的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();$User->where('status=1andid=1')->delete();
联贯作操仅在当次询查或者作操效有,实现后会动自清空联贯作操的全部传值(有一般殊特的联贯作操会录记前当的传值,如cache联贯作操)。简而言之,联贯作操的结果不会带入后以的询查。
统系支撑的联贯作操方法有:
全部的联贯作操都返回前当的模型例实对象(this),其中带*标识的示表支撑多次调用。
用法
由于联贯作操的应用往往涉及到多个方法的结合应用,面上大概分析下各个联贯作操的基本用法:
WHERE
Where方法是应用最多的联贯作操方法,更具体的用法请考参:
速快入门(3)询查语言
。
TABLE
用法示例:
$Model->Table('think_useruser')->where('status>1')->select();
也可以在table方法中跨库作操,例如:
$Model->Table('db_name.think_useruser')->where('status>1')->select();
Table方法的参数支撑字符串和数组,数组式方的用法:
$Model->Table(array('think_user'=>'user','think_group'=>'group'))->where('status>1')->select();
应用数组式方定义的势优是可以免避因为表名和关键字冲突而犯错的情况。
一般情况下,无需调用table方法,认默会动自获得前当模型对应或者定义的据数表。
DATA
应用示例:
$Model->data($data)->add();$Model->data($data)->where('id=3')->save();
Data方法的参数支撑对象和数组,如果是对象会动自转换成数组。如果不定义data方法赋值,也可以应用create方法或者手动给据数对象赋值的式方。
模型的data方法除了建创据数对象以外,还可以读取前当的据数对象,
例如:
$this->find(3);$data=$this->data();
FIELD
应用示例:
$Model->field('id,nicknameasname')->select();$Model->field(array('id','nickname'=>'name'))->select();
如果不调用field方法或者field方法传入参数为空的话,和应用field('*')是效等的。
如果须要显式的传入全部的段字,可以应用面上的方法:
$Model->field(true)->select();
但是我们更议建只获得须要显式的段字名,或者采取段字除排式方来定义,例如:
$Model->field('status',true)->select();
示表获得除了status以外的全部段字。
ORDER
应用示例:
order('iddesc')
排序方法支撑对多个段字的排序
order('statusdesc,idasc')
order方法的参数支撑字符串和数组,数组的用法如下:
order(array('status'=>'desc','id'))
LIMIT
备注 如果不调用limit方法,则示表没有制约
我们晓得不同的据数库类型的limit用法是不尽雷同的,但是在ThinkPHP的用法里头始终是同一的方法,也就是limit('offset,length') ,无论是Mysql、SqlServer还是Oracle据数库,都是这样应用,统系的据数库驱动类会担任决解这个异差化。
应用示例:
limit('1,10')
也可以用面上的写法,是效等的:
limit(1,10)
如果应用
limit('10')
效等于
limit('0,10')
每日一道理
正所谓“学海无涯”。我们正像一群群鱼儿在茫茫的知识之海中跳跃、 嬉戏,在知识之海中出生、成长、生活。我们离不开这维持生活的“海水”,如果跳出这个“海洋”,到“陆地”上去生活,我们就会被无情的“太阳”晒死。
PAGE
Page作操方法是新增的特性,可以更加速快的行进页分询查。
Page方法的用法和limit方法似相,式格为:
Page('page[,listRows]')
Page示表前当的页数,listRows示表每页示显的录记数。例如:
Page('2,10')
示表每页示显10条录记的情况面上,获得第2页的据数。
面上的写法效等:
Page(2,10);
listRow如果不写的话,会读取limit('length') 的值,例如:
limit(25)->page(3);
示表每页示显25条录记的情况面上,获得第3页的据数。
如果limit也没有设置的话,则认默为每页示显20条录记。
page方法加增第二个参数支撑,例如:
$this->page(5,25)->select();
和之前的用法
$this->limit('5,25')->select();
效等。
GROUP
应用示例:
group('user_id')
Group方法的参数只支撑字符串
HAVING
应用示例:
having('user_id>0')
having方法的参数只支撑字符串
JOIN
应用示例:
$Model->join('workONartist.id=work.artist_id')->join('cardONartist.card_id=card.id')->select();
认默采取LEFT JOIN 式方,如果须要用其他的JOIN式方,可以改成
$Model->join('RIGHTJOINworkONartist.id=work.artist_id')->select();
如果join方法的参数用数组的话,只能应用一次join方法,并且不能和字符串式方合混应用。
例如:
join(array('workONartist.id=work.artist_id','cardONartist.card_id=card.id'))
UNION
应用示例:
$Model->field('name')->table('think_user_0')->union('SELECTnameFROMthink_user_1')->union('SELECTnameFROMthink_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')->table('think_user_0')->union(array('SELECTnameFROMthink_user_1','SELECTnameFROMthink_user_2'))->select();
支撑UNION ALL 作操,例如:
$Model->field('name')->table('think_user_0')->union('SELECTnameFROMthink_user_1',true)->union('SELECTnameFROMthink_user_2',true)->select();
或者
$Model->field('name')->table('think_user_0')->union(array('SELECTnameFROMthink_user_1','SELECTnameFROMthink_user_2'),true)->select();
个每union方法相当于一个独立的SELECT句语。
注意:UNION 部内的 SELECT 句语必须有具雷同数量的列。列也必须有具似相的据数类型。同时,每条 SELECT 句语中的列的序顺必须雷同。
DISTINCT
应用示例:
$Model->Distinct(true)->field('name')->select();
LOCK
Lock方法是用于据数库的锁制机,如果在询查或者执行作操的时候应用:
lock(true)
就会动自在成生的SQL句语最后加上 FOR UPDATE或者FOR UPDATE NOWAIT(Oracle据数库)。
VALIDATE
validate方法用于据数的动自验证,我们会在据数验证部份具体述描。
AUTO
auto方法用于据数的动自实现作操,具体应用我们会在据数动自实现部份述描。
SCOPE
scope方法的具体用法可以考参:
3.1的新特性 命名范围
FILTER
filter方法用于对据数对象的安全过滤,例如:
$Model->data($data)->filter('strip_tags')->add();
前目filter方法不支撑多个方法的过滤。
总结
联贯作操为我们的据数作操带来了很大的便捷的地方,并且只要SQL可以实现的作操,基本上都可以用ThinkPHP的联贯作操来实现,并且不必斟酌据数库之间的达表异差,有具可移植性。后面会和大家解讲如何作操和获得变量。
文章结束给大家分享下程序员的一些笑话语录: 不会,Intel会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。