最近研究方法用于,稍微总结一下,后以继续补充:
分析
联贯作操可以效有的进步据数存取的代码清晰度和发开效率,并且支撑全部的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=1 and id=1')->delete();
联贯作操仅在当次询查或者作操效有,实现后会动自清空联贯作操的全部传值(有一般殊特的联贯作操会录记前当的传值,如cache联贯作操)。简而言之,联贯作操的结果不会带入后以的询查。
统系支撑的联贯作操方法有:
方法 | 用作 | 支撑的参数类型 |
---|---|---|
where | 用于询查或者更新件条的定义 | 字符串、数组和对象 |
table | 用于定义要作操的据数表名称 | 字符串和数组 |
alias | 用于给前当据数表定义名别 | 字符串 |
data | 用于新增或者更新据数之前的据数对象赋值 | 数组和对象 |
field | 用于定义要询查的段字(支撑段字除排) | 字符串和数组 |
order | 用于对结果排序 | 字符串和数组 |
limit | 用于制约询查结果数量 | 字符串和数字 |
page | 用于询查页分(部内会转换成limit) | 字符串和数字 |
group | 用于对询查的group支撑 | 字符串 |
having | 用于对询查的having支撑 | 字符串 |
join* | 用于对询查的join支撑 | 字符串和数组 |
union* | 用于对询查的union支撑 | 字符串、数组和对象 |
distinct | 用于询查的distinct支撑 | 布尔值 |
lock | 用于据数库的锁制机 | 布尔值 |
cache | 用于询查存缓 | 支撑多个参数(后以在存缓部份再具体述描) |
relation | 用于关联询查(须要关联模型展扩支撑) | 字符串 |
validate | 用于据数动自验证 | 数组 |
auto | 用于据数动自实现 | 数组 |
filter | 用于据数过滤 | 字符串 |
scope* | 用于命名范围 | 字符串、数组 |
全部的联贯作操都返回前当的模型例实对象(this),其中带*标识的示表支撑多次调用。
用法
由于联贯作操的应用往往涉及到多个方法的结合应用,面上大概分析下各个联贯作操的基本用法:
WHERE
where 用于询查或者更新件条的定义 | |
---|---|
用法 | where($where) |
参数 | where(必须):询查或者作操件条,支撑字符串、数组和对象 |
返回值 | 前当模型例实 |
备注 | 如果不调用where方法,认默不会执行更新和删除作操 |
Where方法是应用最多的联贯作操方法,更具体的用法请考参:
。
TABLE
table定义要作操的据数表名称,动态转变前当作操的据数表名称,须要写据数表的全名,含包前缀,可以应用名别和跨库作操 | |
---|---|
用法 | table($table) |
参数 | table(必须):据数表名称,支撑作操多个表,支撑字符串、数组和对象 |
返回值 | 前当模型例实 |
备注 | 如果不调用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
data可以用于新增或者存保据数之前的据数对象赋值 | |
---|---|
用法 | data($data) |
参数 | data(必须):据数,支撑数组和对象 |
返回值 | 前当模型例实 |
备注 | 如果不调用data方法,则会取前当的据数对象或者传入add和save的据数 |
应用示例:
$Model->data($data)->add(); $Model->data($data)->where('id=3')->save();
Data方法的参数支撑对象和数组,如果是对象会动自转换成数组。如果不定义data方法赋值,也可以应用create方法或者手动给据数对象赋值的式方。
模型的data方法除了建创据数对象以外,还可以读取前当的据数对象,
例如:
$this->find(3); $data = $this->data();
FIELD
field用于定义要询查的段字 | |
---|---|
用法 | field($field,$except=false) |
参数 |
field(必须):段字名,支撑字符串和数组,支撑指定段字名别;如果为true则示表显式或者据数表的全部段字。 except(可选):否是除排,认默为false,如果为true示表定义的段字为据数表中除排field参数定义以外的全部段字。 |
返回值 | 前当模型例实 |
备注 | 如果不调用field方法,则认默返回全部段字,和field('*')效等 |
应用示例:
$Model->field('id,nickname as name')->select(); $Model->field(array('id','nickname'=>'name'))->select();
如果不调用field方法或者field方法传入参数为空的话,和应用field('*')是效等的。
如果须要显式的传入全部的段字,可以应用面上的方法:
$Model->field(true)->select();
但是我们更议建只获得须要显式的段字名,或者采取段字除排式方来定义,例如:
$Model->field('status',true)->select();
示表获得除了status以外的全部段字。
ORDER
order用于对作操结果排序 | |
---|---|
用法 | order($order) |
参数 | order(必须):排序的段字名,支撑字符串和数组,支撑多个段字排序 |
返回值 | 前当模型例实 |
备注 | 如果不调用order方法,按照据数库的认默则规 |
应用示例:
order('id desc')
排序方法支撑对多个段字的排序
order('status desc,id asc')
order方法的参数支撑字符串和数组,数组的用法如下:
order(array('status'=>'desc','id'))
LIMIT
limit用于定义要询查的结果制约(支撑全部的据数库类型) | |
---|---|
用法 | limit($limit) |
参数 | limit(必须):制约数量,支撑字符串 |
返回值 | 前当模型例实 |
备注 | 如果不调用limit方法,则示表没有制约 |
备注 如果不调用limit方法,则示表没有制约
我们晓得不同的据数库类型的limit用法是不尽雷同的,但是在ThinkPHP的用法里头始终是同一的方法,也就是limit('offset,length') ,无论是Mysql、SqlServer还是Oracle据数库,都是这样应用,统系的据数库驱动类会担任决解这个异差化。
应用示例:
limit('1,10')
也可以用面上的写法,是效等的:
limit(1,10)
如果应用
limit('10')
效等于
limit('0,10')
PAGE
page 用于定义要询查的据数页分 | |
---|---|
用法 | page($page) |
参数 | 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 用于据数库的group询查支撑 | |
---|---|
用法 | group($group) |
参数 | group(必须):group的段字名,支撑字符串 |
返回值 | 前当模型例实 |
备注 | 无 |
应用示例:
group('user_id')
Group方法的参数只支撑字符串
HAVING
having 用于据数库的having询查支撑 | |
---|---|
用法 | having($having) |
参数 | having(必须):having,支撑字符串 |
返回值 | 前当模型例实 |
备注 | 无 |
应用示例:
having('user_id>0')
having方法的参数只支撑字符串
JOIN
join 用于据数库的join询查支撑 | |
---|---|
用法 | join($join) |
参数 | join(必须):join作操,支撑字符串和数组 |
返回值 | 前当模型例实 |
备注 | 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
union 用于据数库的union询查支撑 | |
---|---|
用法 | union($union,$all=false) |
参数 | union(必须):union作操,支撑字符串、数组和对象 all(可选):否是采取UNION ALL 作操,认默为false |
返回值 | 前当模型例实 |
备注 | 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') ->table('think_user_0') ->union(array('SELECT name FROM think_user_1','SELECT name FROM think_user_2')) ->select();
支撑UNION ALL 作操,例如:
$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') ->table('think_user_0') ->union(array('SELECT name FROM think_user_1','SELECT name FROM think_user_2'),true) ->select();
个每union方法相当于一个独立的SELECT句语。
注意:UNION 部内的 SELECT 句语必须有具雷同数量的列。列也必须有具似相的据数类型。同时,每条 SELECT 句语中的列的序顺必须雷同。
DISTINCT
distinct 询查据数的时候行进独一过滤 | |
---|---|
用法 | distinct($distinct) |
参数 | distinct(必须):否是采取distinct,支撑布尔值 |
返回值 | 前当模型例实 |
备注 | 无 |
应用示例:
$Model->Distinct(true)->field('name')->select();
LOCK
lock 用于询查或者写入锁定 | |
---|---|
用法 | lock($lock) |
参数 | lock(必须):否是须要锁定,支撑布尔值 |
返回值 | 前当模型例实 |
备注 | join方法支撑多次调用 |
Lock方法是用于据数库的锁制机,如果在询查或者执行作操的时候应用:
lock(true)
就会动自在成生的SQL句语最后加上 FOR UPDATE或者FOR UPDATE NOWAIT(Oracle据数库)。
VALIDATE
validate 用于据数的动自验证 | |
---|---|
用法 | validate($validate) |
参数 | validate(必须):动自验证定义 |
返回值 | 前当模型例实 |
备注 | 只能和create方法配合应用 |
validate方法用于据数的动自验证,我们会在据数验证部份具体述描。
AUTO
auto 用于据数动自实现 | |
---|---|
用法 | auto($auto) |
参数 | auto(必须):定义动自实现 |
返回值 | 前当模型例实 |
备注 | auto方法只能配合create方法应用 |
auto方法用于据数的动自实现作操,具体应用我们会在据数动自实现部份述描。
SCOPE
scope 用于模型的命名范围 | |
---|---|
用法 | scope($scope) |
参数 | scope(必须):命名范围定义 |
返回值 | 前当模型例实 |
备注 | scope方法是实其联贯作操的预定义 |
scope方法的具体用法可以考参:
FILTER
filter 用于据数的安全过滤 | |
---|---|
用法 | filter($filter) |
参数 | filter(必须):过滤方法名 |
返回值 | 前当模型例实 |
备注 | filter方法一般用于写入和更新作操 |
filter方法用于对据数对象的安全过滤,例如:
$Model->data($data)->filter('strip_tags')->add();
前目filter方法不支撑多个方法的过滤。
总结
联贯作操为我们的据数作操带来了很大的便捷的地方,并且只要SQL可以实现的作操,基本上都可以用ThinkPHP的联贯作操来实现,并且不必斟酌据数库之间的达表异差,有具可移植性。后面会和大家解讲如何作操和获得变量。
文章结束给大家分享下程序员的一些笑话语录: 不会,Intel会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。