Você está na página 1de 102

Captulo 10.

Zend_Db
Traduzido por Flvio Gomes da Silva Lisboa (verso 1.5 do Zend Framework)

Sumrio
1 .1. Zend!"b!#dap$er.................................................................................................................. % 1 .1.1. &one'$ando a um (an'o de "ados usando um #dap$ador............................................. 5 1 .1.1.1. )sando um &ons$ru$or do #dap$ador Zend!"b......................................................5 1 .1.1.*. )sando Zend!"b Fa'$or+....................................................................................... 5 1 .1.1.,. )sando Zend!&on-i. 'om Zend!"b Fa'$or+......................................................... / 1 .1.1.%. 0ar1me$ros do #dap$ador........................................................................................ 2 1 .1.1.5. Geren'iando &one34es 5'iosas.............................................................................. 6 1 .1.*. 5 ban'o de dados de e3emplo.........................................................................................6 1 .1.,. Lendo 7esul$ados de &onsul$a...................................................................................... 11 1 .1.,.1. (us'ando um 5b8e$o 7owse$ &omple$o............................................................... 11 1 .1.,.*. #l$erando o Fe$'9 :ode........................................................................................11 1 .1.,.,. (us'ando um 5b8e$o 7owse$ 'omo um ;e$or #sso'ia$ivo.................................. 1* 1 .1.,.%. (us'ando uma &oluna Simples de um 5b8e$o 7owse$......................................... 1, 1 .1.,.5. (us'ando 0ares &9ave<;alor de um 5b8e$o 7owse$............................................ 1, 1 .1.,./. (us'ando uma Lin9a Simples de um 5b8e$o 7owse$........................................... 1% 1 .1.,.2. (us'ando um =s'alar Simples de um 5b8e$o 7owse$...........................................1% 1 .1.%. Gravando #l$era>4es no (an'o de "ados.....................................................................1% 1 .1.%.1. ?n'luindo "ados.................................................................................................... 15 1 .1.%.*. 7e'uperando um ;alor Gerado............................................................................. 1/ 1 .1.%.,. #$ualizando "ados................................................................................................ 12 1 .1.%.%. #pa.ando "ados................................................................................................... 1@ 1 .1.5. &i$ando ;alores e ?den$i-i'adores.................................................................................16 1 .1.5.1. )sando Auo$e() ..................................................................................................... 16 1 .1.5.*. )sando Auo$e?n$o() ...............................................................................................* 1 .1.5.,. )sando Auo$e?den$i-ier() ...................................................................................... *1 1 .1./. &on$rolando Transa>4es de (an'o de "ados................................................................** 1 .1.2. Lis$ando e "es'revendo Tabelas...................................................................................*, 1 .1.@. Fe'9ando um &one3o..................................................................................................*% 1 .1.6. 7odando 5u$ras "e'lara>4es de (an'o de "ados........................................................ *5 1 .1.1 . Bo$as sobre #dap$adores =spe'C-i'os......................................................................... *5 1 .1.1 .1. ?(: "(*............................................................................................................. */ 1 .1.1 .*. :+SDLi...............................................................................................................*/ 1 .1.1 .,. 5ra'le.................................................................................................................. */ 1 .1.1 .%. 0"5 para ?(: "(* e ?n-ormi3 "+nami' Server (?"S).....................................*/ 1 .1.1 .5. 0"5 :i'roso-$ SDL Server................................................................................ *2 1 .1.1 ./. 0"5 :+SDL....................................................................................................... *2 1 .1.1 .2. 0"5 5ra'le......................................................................................................... *2 1 .1.1 .@. 0"5 0os$.reSDL................................................................................................ *2 1 .1.1 .6. 0"5 SDLi$e........................................................................................................ *@ 1 .1.1 .1 . FirebirdE?n$erbase.............................................................................................. *@ 1 .*. Zend!"b!S$a$emen$............................................................................................................. *@ 1 .*.1. &riando uma "e'lara>o............................................................................................... *6 1E1 *

1 .*.*. =3e'u$ando uma "e'lara>o......................................................................................... *6 1 .*.,. (us'ando 7esul$ados de uma "e'lara>o S=L=&T..................................................... , 1 .*.,.1. (us'ando uma Lin9a Simples de um 5b8e$o 7owse$........................................... , 1 .*.,.*. (us'ando um 5b8e$o 7owse$ &omple$o............................................................... ,1 1 .*.,.,. #l$erando o Fe$'9 :ode........................................................................................,* 1 .*.,.%. (us'ando uma &oluna Simples de um 5b8e$o 7owse$......................................... ,* 1 .*.,.5. (us'ando uma Lin9a 'omo um 5b8e$o................................................................. ,, 1 .,. Zend!"b!0ro-iler................................................................................................................. ,, 1 .,.1. ?n$rodu>o..................................................................................................................... ,, 1 .,.*. )sando o 0ro-iler.......................................................................................................... ,5 1 .,.,. )so #van>ado do 0ro-iler.............................................................................................,/ 1 .,.,.1. Fil$ro pelo $empo de 'onsul$a $rans'orrido............................................................,/ 1 .,.,.*. Fil$ro pelo $ipo de 'onsul$a.................................................................................... ,2 1 .,.,.,. 7e'uperar per-is por $ipo de 'onsul$a....................................................................,2 1 .%. Zend!"b!Sele'$....................................................................................................................,@ 1 .%.1. 7esumo do 5b8e$o Sele'$.............................................................................................. ,@ 1 .%.*. &riando um 5b8e$o Sele'$............................................................................................. ,@ 1 .%.,. &ons$ruindo 'onsul$as Sele'$........................................................................................ ,6 1 .%.,.1. #di'ionando uma 'lusula F75:........................................................................ % 1 .%.,.*. #di'ionando &olunas............................................................................................ %1 1 .%.,.,. #di'ionando &olunas de =3presso...................................................................... %* 1 .%.,.%. #di'ionando 5u$ra Tabela F &onsul$a 'om G5?B.................................................%, 1 .%.,.5. #di'ionando uma &lusula HI=7=.................................................................... %/ 1 .%.,./. #di'ionando uma 'lusula G75)0 (J............................................................... %6 1 .%.,.2. #di'ionando uma &lusula I#;?BG...................................................................%6 1 .%.,.@. #di'ionando uma &lusula 57"=7 (J.............................................................. 5 1 .%.,.6. #di'ionando uma &lsula L?:?T......................................................................... 51 1 .%.,.1 . #di'ionando o :odi-i'ador de &onsul$a "?ST?B&T......................................... 5* 1 .%.,.11. #di'ionando o :odi-i'ador de &onsul$a F57 )0"#T=...................................5* 1 .%.%. =3e'u$ando &onsul$as Sele'$........................................................................................ 5* 1 .%.%.1. =3e'u$ando &onsul$as Sele'$ do "b #dap$er........................................................5, 1 .%.%.*. =3e'u$ando &onsul$as Sele'$ a par$ir de um 5b8e$o............................................. 5, 1 .%.%.,. &onver$endo um 5b8e$o Sele'$ para um Li$eral SDL........................................... 5, 1 .%.5. 5u$ros mK$odos............................................................................................................. 5% 1 .%.5.1. 7e'uperando 0ar$es do 5b8e$o Sele'$................................................................... 5% 1 .%.5.*. 7e'ompondo 0ar$es do 5b8e$o Sele'$................................................................... 55 1 .5. Zend!"b!Table.................................................................................................................... 5/ 1 .5.1. ?n$rodu>o F &lasse Table............................................................................................. 5/ 1 .5.*. "e-inindo uma &lasse Table......................................................................................... 5/ 1 .5.*.1. "e-inindo o Bome e o =sAuema da Tabela........................................................... 5/ 1 .5.*.*. "e-inindo a &9ave 0rimria da Tabela................................................................. 5@ 1 .5.*.,. Sobres'revendo :K$odos de &on-i.ura>o de Table............................................ 5@ 1 .5.*.%. Table ini$ializa$ion.................................................................................................56 1 .5.,. &riando uma ?ns$1n'ia de Table..................................................................................../ 1 .5.,.1. =spe'i-i'ando um #dap$ador de (an'o de "ados................................................ / 1 .5.,.*. &on-i.urando um #dap$ador de (an'o de "ados 0adro...................................../ 1 .5.,.,. #rmazenando um #dap$ador de (an'o de "ados no 7e.is$ro............................. /1 1 .5.%. ?n'luindo Lin9as em uma Tabela................................................................................../1 1 .5.%.1. )sar um Table 'om uma &9ave de #u$o<in'remen$al.......................................... /* 1 .5.%.*. )sando um Table 'om um SeAuen'e................................................................... /, *E1 *

1 .5.%.,. )ando um Table 'om uma &9ave Ba$ural............................................................ /, 1 .5.5. #$ualizando Lin9as em um Table................................................................................. /% 1 .5./. =3'luindo Lin9as de um Table..................................................................................... /% 1 .5.2. 0ro'urando Lin9as pela &9ave 0rimria......................................................................./5 1 .5.@. &onsul$ando um &on8un$o de Lin9as............................................................................// 1 .5.@.1. #0? Sele'$.............................................................................................................// 1 .5.@.*. (us'ando um 'on8un$o de lin9as.........................................................................../@ 1 .5.@.,. )so avan>ado........................................................................................................ /@ 1 .5.6. &onsul$ando uma Lin9a Simples.................................................................................. 2 1 .5.1 . 7e'uperando ?n-orma>4es de :e$adados de Tabelas................................................. 2 1 .5.11. &a'9eando :e$adados de Tabela................................................................................21 1 .5.1*. &us$omizando e =s$endendo uma &lasse Table..........................................................2, 1 .5.1*.1. )sando &lasses 7ow ou 7owse$ &us$omizadas..................................................2, 1 .5.1*.*. "e-inindo LL.i'a &us$omizada para ?nser$M )pda$e e "ele$e............................. 2% 1 .5.1*.,. "e-ina :K$odos de (us'a &us$omizados em Zend!"b!Table...........................25 1 .5.1*.%. "e-ina ?n-le'$ion em Zend!"b!Table................................................................ 25 1 ./. Zend!"b!Table!7ow...........................................................................................................2/ 1 ./.1. ?n$rodu>o..................................................................................................................... 2/ 1 ./.*. (us'ando uma Lin9a.....................................................................................................22 1 ./.*.1. Lendo valores de 'oluna de uma lin9a.................................................................. 22 1 ./.*.*. 7e'uperando "ados de Lin9a 'omo um ;e$or..................................................... 2@ 1 ./.*.,. (us'ando dados de $abelas rela'ionadas............................................................... 2@ 1 ./.,. =s'revendo lin9as em um ban'o de dados....................................................................2@ 1 ./.,.1. #l$erando valores de 'oluna em uma lin9a........................................................... 2@ 1 ./.,.*. ?n'luindo uma nova lin9a...................................................................................... 26 1 ./.,.,. #l$erando valores em mNl$iplas 'olunas............................................................... @ 1 ./.,.%. #pa.ando uma lin9a..............................................................................................@ 1 ./.%. Serializando e desserializando lin9as............................................................................@1 1 ./.%.1. Serializando uma Lin9a.........................................................................................@1 1 ./.%.*. "esserializando "ados de Lin9a........................................................................... @1 1 ./.%.,. 7ea$ivando uma Lin9a 'omo "ado #$ivo............................................................. @* 1 ./.5. =s$endendo a 'lasse 7ow.............................................................................................. @* 1 ./.5.1. ?ni'ialia>o de 7ow............................................................................................... @, 1 ./.5.*. "e-inindo LL.i'a &us$omizada para ?nser$M )pda$eM e "ele$e em Zend!"b!Table!7ow.......................................................................................................... @, 1 ./.5.,. "e-ina ?n-le'$ion em Zend!"b!Table!7ow......................................................... @5 1 .2. Zend!"b!Table!7owse$...................................................................................................... @/ 1 .2.1. ?n$rodu>o..................................................................................................................... @/ 1 .2.*. (us'ando um 7owse$....................................................................................................@/ 1 .2.,. 7e'uperando Lin9as de um &on8un$o de Lin9as.......................................................... @/ 1 .2.%. 7e'uperando um ob8e$o 7owse$ 'omo um ;e$or......................................................... @@ 1 .2.5. Serializando e "esserializando um ob8e$o 7owse$....................................................... @6 1 .2./. =s$endendo a 'lasse 7owse$..........................................................................................6 1 .@. 7ela'ionamen$os Zend!"b!Table........................................................................................61 1 .@.1. ?n$rodu>o..................................................................................................................... 61 1 .@.*. "e-inindo 7ela'ionamen$os.......................................................................................... 6* 1 .@.,. (us'ando um ob8e$o 7owse$ "ependen$e.....................................................................6% 1 .@.%. (us'ando uma Lin9a :e.............................................................................................6/ 1 .@.5. (us'ando um ob8e$o 7owse$ a$ravKs de um 7ela'ionamen$o :ui$os<para<mui$os......6@ 1 .@./. 5pera>4es de =s'ri$a em &as'a$a................................................................................1 ,E1 *

1 .@./.1. Bo$as de &onsidera>o sobre 5pera>4es em &as'a$a......................................... 1 *

10.1. Zend_Db_Adapter
Zend!"b e suas 'lasses rela'ionadas provOem uma in$er-a'e de ban'o de dados SDL simples para Zend Framework. Zend!"b!#dap$er K a 'lasse bsi'a Aue vo'O usa para 'one'$ar sua apli'a>o 0I0 a um 7"(:S1. I di-eren$es 'lasses adap$adoras para 'ada mar'a de 7"(:S. 5s adap$adores Zend!"b 'riam uma pon$e das e3$ens4es 0I0 espe'C-i'as de um vendedor para uma in$er-a'e 'omumM de modo a a8udar vo'O a es'rever apli'a>4es 0I0 uma vez e dis$ribuC<las 'om mNl$iplas mar'as de 7"(:S 'om pou'o es-or>o. # in$er-a'e da 'lasse adap$adora K similar a in$er-a'e da e3$enso 0I0 "a$a 5b8e'$s. Zend!"b provO 'lasses adap$adoras de drivers 0"5 para as se.uin$es mar'as de 7"(:SP

?(: "(* e ?n-ormi3 "+nami' Server (?"S)M usando a e3$enso 0I0 pdo!ibm :+SDLM usando a e3$enso 0I0 pdo!m+sAl :i'roso-$ SDL ServerM usando a e3$enso 0I0 pdo!mssAl 5ra'leM usando a e3$enso 0I0 pdo!o'i 0os$.reSDLM usando a e3$enso 0I0 pdo!p.sAl SDLi$eM usando a e3$enso 0I0 pdo!sAli$e

=m adi>oM Zend!"b provO 'lasses adap$adoras Aue u$ilizam e3$ens4es de ban'os de dados 0I0 para as se.uin$es mar'as de 7"(:SP

:+SDLM usando a e3$enso 0I0 m+sAli 5ra'leM usando a e3$enso 0I0 o'i@ ?(: "(*M usando a e3$enso 0I0 ibm!db* FirebirdE?n$erbaseM usando a e3$ensp 0I0 p9p!in$erbase Nota &ada adap$ador Zend!"b usa uma e3$enso 0I0. ;o'O deve $er a e3$enso 0I0 respe'$iva 9abili$ada em seu ambien$e 0I0 para usar um adap$ador Zend!"b. 0or e3emploM se vo'O usar AualAuer um dos adap$adores Zend!"b 0"5M vo'O pre'isa 9abili$ar $an$o a e3$enso 0"5 Auan$o o driver 0"5 para a mar'a de 7"(:S Aue vo'O usa.

1 7ela$ional "a$abase :ana.emen$ S+s$emP Sis$ema Geren'iador de (an'o de "ados 7ela'ional

%E1 *

10.1.1. Conectando a um Banco de Dados usando um Adaptador


=s$a se>o des'reve 'omo 'riar uma ins$1n'ia de um adap$ador de ban'o de dados. ?sso 'orresponde a -azer uma 'one3o ao seu servidor 7"(:S de sua apli'a>o 0I0. 10.1.1.1. Usando um Construtor do Adaptador Zend_Db ;o'O pode 'riar uma ins$1n'ia de um adap$ador usando seu 'ons$ru$or. )m 'ons$ru$or de adap$ador leva um ar.umen$oM Aue K um ve$or de par1me$ros usados para de'larar a 'one3o Exemplo 10.1. Usando um Construtor do Adaptador
<?php require_once 'Zend/Db/Adapter/Pdo/Mysql.php'; $db ne! Zend_Db_Adapter_Pdo_Mysql"array" 'host' # '$%&.'.'.$'( 'userna)e' # '!ebuser'( 'pass!ord' # '********'( 'dbna)e' # 'test' ++;

10.1.1.2. Usando Zend_Db Factory &omo uma al$erna$iva a usar o 'ons$ru$or do adap$ador dire$amen$eM vo'O pode 'riar uma ins$1n'ia de um adap$ador usando o mK$odo es$$i'o Zend_Db,,-actory"+. =sse mK$odo 'arre.a dinami'amen$e o arAuivo da 'lasse adap$adora sob demandaM usando Zend!LoaderPPload&lass(). 5 primeiro ar.umen$o K um li$eral Aue represen$a o nome base da 'lasse adap$adora. 0or e3emplo o li$eral Q0do!:+sAlQ 'orresponde a 'lasse Zend!"b!#dap$er!0do!:+sAl. 5 se.undo ar.umen$o pe o mesmo ve$or de par1me$ros Aue vo'O $eria dados ao 'ons$ru$or do adap$ador. Exemplo 10.2. Usando o m todo !actory do adaptador
<?php require_once 'Zend/Db.php'; // .arre/a auto)atica)ente a classe Zend_Db_Adapter_Pdo_Mysql e cria u)a inst0ncia dela. $db Zend_Db,,-actory"'Pdo_Mysql'( array" 'host' # '$%&.'.'.$'( 'userna)e' # '!ebuser'( 'pass!ord' # '********'( 'dbna)e' # 'test' ++;

5E1 *

Se vo'O 'riar sua prLpria 'lasse Aue es$ende Zend!"b!#dap$er!#bs$ra'$M mas vo'O no nomear sua 'lasse 'om o pre-i3o de pa'o$e RZend!"b!#dap$erRM vo'O pode usar o mK$odo -actory"+ para 'arre.ar seu adap$ador se vo'O espe'i-i'ar a par$e 'ondu$ora da 'lasse adap$adora 'om a '9ave Qadap$erBamespa'eQ no ve$or de par1me$ros. Exemplo 10.". Usando o m todo !actory do adaptador para uma classe adaptadora custom#$ada
<?php require_once 'Zend/Db.php'; // .arre/a auto)atica)ente a classe MyPro1ect_Db_Adapter_Pdo_Mysql e cria u)a inst0ncia dela. $db Zend_Db,,-actory"'Pdo_Mysql'( array" 'host' # '$%&.'.'.$'( 'userna)e' # '!ebuser'( 'pass!ord' # '********'( 'dbna)e' # 'test'( 'adapter2a)espace' # 'MyPro1ect_Db_Adapter' ++;

10.1.1.". Usando Zend_Con!#% com Zend_Db Factory 5p'ionalmen$eM vo'O pode espe'i-i'ar um ar.umen$o do mK$odo -actory"+ 'omo um ob8e$o do $ipo Zend!&on-i.. Se o primeiro ar.umen$o K um ob8e$o de 'on-i.ura>oM K esperado Aue ele 'on$en9a uma propriedade '9amada adapterM 'on$endo um li$eral de-inindo o nome base da 'lasse adap$adora. 5p'ionalmen$eM o ob8e$o pode 'on$er uma propriedade '9amada para)sM 'om subpropriedades 'orresponden$es aos nomes de par1me$ro do adap$ador. ?sso K usado somen$e se o se.undo ar.umen$o do mK$odo -actory"+ es$iver ausen$e. Exemplo 10.&. Usando o m todo !actory do adaptador com um ob'eto Bo e3emplo abai3oM um ob8e$o Zend!&on-i. K 'riado a par$ir de um ve$or. ;o'O pode $ambKm 'arre.ar dados de um arAuivo e3$ernoM por e3emplo 'om Zend!&on-i.!?ni ou Zend!&on-i.!Sml.
<?php require_once 'Zend/.on-i/.php'; require_once 'Zend/Db.php'; $con-i/ ne! Zend_.on-i/" array" 'database' # array" 'adapter' # 'Mysqli'( 'para)s' # array" 'dbna)e' # 'test'( 'userna)e' # '!ebuser'( 'pass!ord' # 'secret'( + +

/E1 *

+; $db

+ Zend_Db,,-actory"$con-i/3#database+;

5 se.undo ar.umen$o do mK$odo -actory"+ pode ser um ve$or asso'ia$ivo 'on$endo en$radas 'orrespondens aos par1me$ros do adap$ador. =sse ar.umen$o K op'ional. Se o primeiro ar.umen$o K do $ipo Zend!&on-i.M K assumido Aue ele 'on$Km $odos os par1me$rosM e o se.undo ar.umen$o K i.norado. 10.1.1.&. (ar)metros do Adaptador # lis$a abai3o e3pli'a par1me$ros 'omuns re'on9e'idos pelas 'lasses adap$adoras Zend!"b.

*ostP um li$eral 'on$endo um nome de 9ospedeiro ou um endere>o ?0 do servidor de ban'o de dados. Se o ban'o de dados es$ rodando no mesmo 9ospedeiro Aue a apli'a>o 0I0M vo'O pode usar Qlo'al9os$Q ou Q1*2. . .1Q. usernameP iden$i-i'ador de 'on$a para au$en$i'ar uma 'one3o ao servidor 7"(:S. pass+ordP 'reden'ial de sen9a da 'on$a para au$en$i'ar uma 'one3o ao servidor 7"(:S. dbnameP nome da ins$1n'ia do ban'o de dados no servidor 7"(:S. portP al.uns servidores 7"(:S podem a'ei$ar 'one34es de rede em um nNmero de por$a espe'i-i'ado pelo adminis$rador. 5 par1me$ro por$ permi$e Aue vo'O espe'i-iAue a por$a na Aual sua apli'a>o 0I0 se 'one'$aM de modo a 'asar 'om a por$a 'on-i.urada no servidor 7"(:S. opt#onsP es$e par1me$ro K um ve$or asso'ia$ivo de op>4es Aue so .enKri'as para $odas as 'lasses Zend!"b!#dap$er. dr#,er_opt#onsP es$e par1me$ro K uma ve$or asso'ia$ivo de op>4es adi'ionais Aue so espe'C-i'as para uma dada e3$enso de ban'o de dados. )m uso $Cpi'o desse par1me$ro K 'on-i$.urar a$ribu$os de um driver 0"5. adapterNamespaceP de$ermina a par$e ini'ial do nome da 'lasse para o adap$adorM ao invKs de QZend!"b!#dap$erQ. )sa isso se vo'O pre'isa usar o mK$odo -actory"+ para 'arre.ar uma 'lasse adap$adora de ban'o de dados no<Zend.

Exemplo 10.-. (assando a op./o case0!old#n% para o !actory ;o'O pode espe'i-i'ar essa op>o pela 'ons$an$e Zend_Db,,.A45_678D92:. ?sso 'orresponde ao a$ribu$o A;;<_.A45 nos drivers de ban'o de dados 0"5 e ?(: "(*M a8us$ando a 'ai3a de '9aves li$erais em 'on8un$os de resul$ado de 'onsul$as. # op>o leva os valores Zend_Db,,.A45_2A;=<A8 (o padro)M Zend_Db,,.A45_=PP5<M e Zend_Db,,.A45_87>5<. 2E1 *

<?php $options array" Zend_Db,,.A45_678D92: # Zend_Db,,.A45_=PP5< +; $para)s array" 'host' # '$%&.'.'.$'( 'userna)e' # '!ebuser'( 'pass!ord' # '********'( 'dbna)e' # 'test'( 'options' # $options +; $db Zend_Db,,-actory"'Db%'( $para)s+;

Exemplo 10.1. (assando a op./o auto02uot#n% para o !actory ;o'O pode espe'i-i'ar essa op>o pela 'ons$an$e Zend_Db,,A=;7_?=7;5_9D52;9695<4. Se o valor K true (o padro)M iden$i-i'adores 'omo nomes de $abelaM nomes de 'olunaM e mesmo apelidos so delimi$ados em $oda sin$a3e SDL .erada pelo ob8e$o adap$ador. ?sso $orna simples usar iden$i-i'adores Aue 'on$Om palavras '9aveM ou 'ara'$eres espe'iais. Se o valor K -alseM iden$i-i'adores no so delimi$ador au$oma$i'amen$e. Se vo'O pre'isar delimi$ar iden$i-i'adoresM vo'O deve -azer por 'on$a prLpria uso do mK$odo quote9denti-ier"+.
<?php $options array" Zend_Db,,A=;7_?=7;5_9D52;9695<4 # -alse +; $para)s array" 'host' # '$%&.'.'.$'( 'userna)e' # '!ebuser'( 'pass!ord' # '********'( 'dbna)e' # 'test'( 'options' # $options +; $db Zend_Db,,-actory"'Pdo_Mysql'( $para)s+;

Exemplo 10.3. (assando op.4es de dr#,er (D5 para o !actory


<?php $pdoPara)s array" PD7,,M@4?8_A;;<_=45_A=665<5D_?=5<@ +; $para)s array" 'host' # '$%&.'.'.$'( 'userna)e' # '!ebuser'( 'pass!ord' # '********'( 'dbna)e' # 'test'( 'driBer_options' # $pdoPara)s +;

# true

@E1 *

$db Zend_Db,,-actory"'Pdo_Mysql'( $para)s+; echo $db3#/et.onnection"+3#/etAttribute"PD7,,M@4?8_A;;<_=45_A=665<5D_?=5<@+;

10.1.1.-. 6erenc#ando Conex4es 5c#osas &riar uma ins$1n'ia de uma 'lasse adap$adora no 'one'$a imedia$amen$e ao servidor 7"(:S. 5 adap$ador .rava os par1me$ros da 'one3oM e -az a 'one3o a$ual sob demandaM na primeira vez Aue vo'O pre'isa e3e'u$ar uma 'onsul$a. ?sso .aran$e Aue a 'ria>o do ob8e$o adap$ador se8a rpida e bara$a. ;o'O pode 'riar uma ins$1n'ia de um adap$ador mesmo se vo'O no es$ 'er$o de Aue pre'isar rodar AuaisAuer 'onsul$as de ban'o de dados duran$e a reAuisi>o a$ual Aue sua apli'a>o es$ servindo. Se vo'O pre'isar -or>ar o adap$ador a se 'one'$ar ao 7"(:SM use o mK$odo /et.onnection"+. =sse mK$odo re$orna um ob8e$o para 'one3o 'omo represen$ado pela e3$enso de ban'o de dados 0I0 respe'$iva. 0or e3emploM se vo'O usar AualAuer das 'lasses adap$adoras para drivers 0"5M en$o /et.onnection"+ re$orna o ob8e$o 0"5M depois de ini'i<lo 'omo uma 'one3o a$iva para o ban'o de dados espe'C-i'o. 0ode ser N$il -or>ar a 'one3o se vo'O Auiser 'ap$urar AuaisAuer e3'e>4es Aue -orem lan>adas 'omo resul$ado de 'reden'iais de 'on$a invlidasM ou ou$ra -al9a de 'one3o ao servidor 7"(:S. =ssas e3'e>4es no so lan>adas a$K a 'one3o ser -ei$aM assim ele pode a8udar a simpli-i'ar o 'Ldi.o de sua apli'a>o se vo'O manipular as e3'e>4es em um lu.arM ao invKs de no momen$o da primeira 'onsul$a 'on$ra o ban'o de dados. Exemplo 10.7. 8an#pulando exce.4es de conex/o
<?php try C $db Zend_Db,,-actory"'Pdo_Mysql'( $para)eters+; $db3#/et.onnection"+; D catch "Zend_Db_Adapter_5*ception $e+ C // talBeE u)a -alha de credencial de lo/in( talBeE o <DAM4 nFo este1a rodando D catch "Zend_5*ception $e+ C // talBeE -actory"+ -alhou ao carre/ar a classe adaptadora especi-icada D

10.1.2. 5 banco de dados de exemplo


Ba do'umen$a>o para 'lasses Zend!"bM nLs usamos um 'on8un$o de $abelas simples para ilus$rar o uso das 'lasses e mK$odos. =ssas $abelas de e3emplo poderiam armazenar in-orma>4es para ras$rear bu.s em um pro8e$o de desenvolvimen$o de so-$ware. 5 ban'o de dados 'on$Km Aua$ro $abelasP

accounts armazena in-orma>o sobre 'ada usurio do ban'o de dados de ras$reamen$o de 6E1 *

bu..

products armazena in-orma>o sobre 'ada produ$o para o Aual um bu. pode ser lo.ado. bu%s armazena in-orma>o sobre bu.sM in'luindo o es$ado a$ual do bu.M a pessoa Aue repor$ou o bu.M a pessoa Aue K in'umbida de 'orri.ir o bu.M e a pessoa Aue K in'umbida de veri-i'ar a 'orre>o. bu%s_products armazena um rela'ionamen$o en$re bu.s e produ$os. ?sso implemen$a um rela'ionamen$o mui$os<pra<mui$osM porAue um dado bu. pode ser relevan$e para mNl$iplos produ$osM e na verdade um dado produ$o pode $er mNl$iplos bu.s.

5 se.uin$e pseudo'Ldi.o de lin.ua.em de de-ini>o de dados SDL des'reve as $abelas nes$e e3emplo de ban'o de dados. =ssas $abelas de e3emplo so usadas e3$ensivamen$e pelos $es$es uni$rios au$oma$izados para Zend!"b.
.<5A;5 ;AA85 accounts " account_na)e GA<.HA<"$''+ 27; 2=88 P<9MA<@ I5@ +; .<5A;5 ;AA85 products " product_id 92;5:5< 27; 2=88 P<9MA<@ I5@( product_na)e GA<.HA<"$''+ +; .<5A;5 ;AA85 bu/s " bu/_id 92;5:5< 27; 2=88 P<9MA<@ I5@( bu/_description GA<.HA<"$''+( bu/_status GA<.HA<"%'+( reported_by GA<.HA<"$''+ <565<52.54 accounts"account_na)e+( assi/ned_to GA<.HA<"$''+ <565<52.54 accounts"account_na)e+( Beri-ied_by GA<.HA<"$''+ <565<52.54 accounts"account_na)e+ +; .<5A;5 ;AA85 bu/s_products " bu/_id 92;5:5< 27; 2=88 <565<52.54 bu/s( product_id 92;5:5< 27; 2=88 <565<52.54 products( P<9MA<@ I5@ "bu/_id( product_id+ +;

Bo$e $ambKm Aue a $abela bu/s 'on$Km mNl$iplas re-erOn'ias de '9ave es$ran.eira para a $abela accounts. &ada uma das '9aves es$ran.eiras pode re-eren'iar uma lin9a di-eren$e na $abela accounts para um dado bu.. 5 dia.ram abai3o ilus$ra o modelo de dados -Csi'o do ban'o de dados de e3emplo.

1 E1 *

10.1.". 9endo :esultados de Consulta


=s$a se>o des'reve mK$odos da 'lasse adap$adora 'om os Auais vo'O pode rodar 'onsul$as S=L=&T e re'uperar resul$ados de 'onsul$a. 10.1.".1. Buscando um 5b'eto :o+set Completo ;o'O pode rodar uma 'onsul$a SDL S=L=&T e re'uperar seu resul$ado em um passo usando o mK$odo -etchAll"+. 5 primeiro ar.umen$o para es$e mK$odo K um li$eral 'on$endo uma de'lara>o S=L=&T. "e modo al$erna$ivoM o primeiro ar.umen$o pode ser um ob8e$o da 'lasse Zend!"b!Sele'$. 5 adap$ador au$oma$i'amen$e 'onver$e esse ob8e$o para uma represen$a>o li$eral da de'lara>o S=L=&T. 5 se.undo ar.umen$o para -etchAll"+ K um ve$or de valores a serem subs$i$uCdos pelos espa>os reservados para par1me$ros na de'lara>o SDL. Exemplo 10.;. Usando !etc*All<=
<?php $sql '4585.; J 6<7M bu/s >H5<5 bu/_id $result $db3#-etchAll"$sql( %+;

?';

10.1.".2. Alterando o Fetc* 8ode 0or padroM -etchAll"+ re$orna um ve$or de lin9asM 'ada uma das Auais K um ve$or asso'ia$ivo. #s '9aves do ve$or asso'ia$ivo so as 'olunas ou apelidos de 'oluna de-inidos na 'onsul$a S=L=&T. ;o'O pode espe'i-i'ar um es$ilo di-eren$e de resul$ados de bus'a usando o mK$odo 11E1 *

set6etchMode"+. 5s modos supor$ados so iden$i-i'ados por 'ons$an$esP

Zend_Db>>FE?C@_AAA5CP re$orna dados em um ve$or de ve$ores asso'ia$ivos. #s '9aves do ve$or so nomes de 'olunaM 'omo li$erais. =sse K o modo de bus'a padro para 'lasses Zend!"b!#dap$er. Bo$e Aue se sua lis$a de sele>o 'on$Km mais de uma 'oluna 'om o mesmo nomeM por e3emplo se elas so de duas $abelas di-eren$es em um G5?BM pode 9aver somen$e uma en$rada no ve$or asso'ia$ivo para o nome dados. Se vo'O usar o modo F=T&I!#SS5&M vo'O deve espe'i-i'ar apelidos de 'oluna em sua 'onsul$a S=L=&T para .aran$ir Aue os nomes do resul$ado em '9aves de ve$or Nni'as. 0or padroM esses li$erais so re$ornados do mesmo 8ei$o Aue o driver do ban'o de dados re$orna. ?sso K $ipi'amen$e a or$o.ra-ia da 'oluna no servidor 7"(:S. ;o'O pode espe'i-i'ar a 'ai3a para esses li$eraisM usando a op>o Zend_Db,,.A45_678D92:. =spe'i-iAue isso Auando ins$an'iar o adap$ador. ;e8a =3emplo 1 .5M T0assando a op>o 'ase<-oldin. para o -a'$or+U.

Zend_Db>>FE?C@_NU8P re$orna dados em um ve$or de ve$ores. 5s ve$ores so inde3ados por in$eirosM 'orresponden$es a posi>o do respe'$ivo 'ampo na lis$a de sele>o da 'onsul$a. Zend_Db>>FE?C@_B5?@P re$orna dados em um ve$or de ve$ores. #s '9aves do ve$or so $an$o li$erais 'omo os usados no modo F=T&I!#SS5&M Auan$o in$eiros 'omo os usados no modo F=T&I!B):. Bo$e Aue o nNmero de elemen$os no ve$or K o dobro do Aue seria em um ve$or se vo'O usasse ou F=T&I!#SS5& ou F=T&I!B):. Zend_Db>>FE?C@_C59U8NP re$orna dados em um ve$or de valores. 5 valor em 'ada ve$or K o valor re$ornado por uma 'oluna do 'on8un$o de resul$ado. 0or padroM essa K a primeira 'olunaM inde3ada por . Zend_Db>>FE?C@_5BBP re$orna dados em um ve$or de ob8e$os. # 'lasse padro K a 'lasse in$erna 0I0 s$d&lass. &olunas do 5b8e$o 7owse$ -i'am disponCveis 'omo propriedades pNbli'as do ob8e$o.

Exemplo 10.10. Usando setFetc*8ode<=


<?php $db3#set6etchMode"Zend_Db,,65;.H_7AK+; $result $db3#-etchAll"'4585.; J 6<7M bu/s >H5<5 bu/_id // $result L u) Beto de ob1etos echo $resultM'N3#bu/_description;

?'( %+;

10.1.".". Buscando um 5b'eto :o+set como um Cetor Assoc#at#,o 5 mK$odo -etchAssoc"+ re$orna dados em um ve$or de ve$ores asso'ia$ivosM independen$emen$e 1*E1 *

de Aual valor vo'O $en9a 'on-i.urado para o modo de bus'a. Exemple 10.11. Usando !etc*Assoc<=
<?php $db3#set6etchMode"Zend_Db,,65;.H_7AK+; $result $db3#-etchAssoc"'4585.; J 6<7M bu/s >H5<5 bu/_id ?'( %+; // $result L u) Betor de Betores associatiBos( apesar do )odo de busca echo $resultM'NM'bu/_description'N;

10.1.".&. Buscando uma Coluna A#mples de um 5b'eto :o+set 5 mK$odo -etch.ol"+ re$orna dados em um ve$o de valoresM independen$emen$e do valor Aue vo'O $en9a 'on-i.urado para o modo de bus'a. ?sso somen$e re$orna a primeira 'oluna devolvida pela 'onsul$a. DuaisAuer ou$ras 'olunas re$ornadas pela 'onsul$a so des'ar$adas. Se vo'O pre'isa re$ornar uma ou$ra 'oluna Aue no se8a a primeiraM ve8a Se>o 1 .*.,.%M T(us'ando uma &oluna Simples de um 5b8e$o 7owse$U. Exemplo 10.12. Usando !etc*Col<=
<?php $db3#set6etchMode"Zend_Db,,65;.H_7AK+; $result $db3#-etch.ol"'4585.; bu/_description( bu/_id 6<7M bu/s >H5<5 bu/_id ?'( %+; // contL) bu/_description; bu/_id nFo L deBolBido echo $resultM'N;

10.1.".-. Buscando (ares C*a,e0Calor de um 5b'eto :o+set 5 mK$odo -etchPairs"+ re$orna dados em um ve$or de pares '9ave<valorM 'omo um ve$or asso'ia$ivo 'om uma en$rada simples por lin9a. # '9ave desse ve$or asso'ia$ivo K $omada da primeira 'oluna re$ornada pela 'onsul$a S=L=&T. 5 valor K $omado da se.unda 'oluna re$ornada pela 'onsul$a S=L=&T. DuaisAuer ou$ras 'olunas re$ornadas pela 'onsul$a so des'ar$adas. ;o'O deve pro8e$ar a 'onsul$a S=L=&T de modo Aue a primeira 'oluna re$ornada $en9a valores Nni'os. Se 9 valores dupli'ados na primeira 'olunaM as en$radas no ve$or asso'ia$ivo sero sobres'ri$as. Exemplo 10.1". Usando !etc*(a#rs<=
<?php $db3#set6etchMode"Zend_Db,,65;.H_7AK+;

1,E1 *

$result $db3#-etchPairs"'4585.; bu/_id( bu/_status 6<7M bu/s'+; echo $resultM%N;

10.1.".1. Buscando uma 9#n*a A#mples de um 5b'eto :o+set 5 mK$odo -etch<o!"+ re$orna dados usando o modo de bus'a a$ualM mas ele re$orna somen$e a primeira lin9a do 5b8e$o 7owse$. Exemplo 10.1&. Usando !etc*:o+<=
<?php $db3#set6etchMode"Zend_Db,,65;.H_7AK+; $result $db3#-etch<o!"'4585.; J 6<7M bu/s >H5<5 bu/_id %'+; // note que $result L u) si)ples ob1eto( nFo u) Betor de ob1etos echo $result3#bu/_description;

10.1.".3. Buscando um Escalar A#mples de um 5b'eto :o+set 5 mK$odo -etch7ne"+ K 'omo uma 'ombina>o de -etch<o!"+ 'om -etch.ol"+M na Aual ele re$orna dados somen$e para a primeira lin9a do 5b8e$o 7owse$M e re$orna somen$e o valor da primeira 'oluna dessa lin9a. 0or$an$o ele re$orna somen$e um valor es'alar simplesM no um ve$or ou um ob8e$o. Exemplo 10.1-. Usando !etc*5ne<=
<?php $result $db3#-etch7ne"'4585.; bu/_status 6<7M bu/s >H5<5 bu/_id // isto L u) Balor literal si)ples echo $result;

%'+;

10.1.&. 6ra,ando Altera.4es no Banco de Dados


;o'O pode usar a 'lasse adap$adora para .ravar novos dados ou al$erar dados e3is$en$es em seu ban'o de dados. =s$a se>o des'reve mK$odos para -azer essas opera>4es. 10.1.&.1. Dnclu#ndo Dados ;o'O pode adi'ionar novas lin9as a $abela em seu ban'o de dados usando o mK$odo insert"+. 5 1%E1 *

primeiro ar.umen$o K um li$eral Aue denomina a $abelaM e o se.undo ar.umen$o K um ve$or asso'ia$ivoM mapeando os nomes de 'oluna para valores de dados. Exemplo 10.11. Dnclu#ndo uma tabela
<?php $data array" 'created_on' # '%''&3'O3%%'( 'bu/_description' # '4o)ethin/ !ron/'( 'bu/_status' # '25>' +; $db3#insert"'bu/s'( $data+;

#s 'olunas Aue vo'O e3'luir de um ve$or de dados no so espe'i-i'adas para o ban'o de dados. 0or$an$oM elas se.uiro as mesmas re.ras Aeu uma de'lara>o SDL ?BS=7T se.ueP se a 'oluna $em uma 'lusula "=F#)LTM a 'oluna leva aAuele valor na lin9a 'riadaM 'aso 'on$rrio a 'oluna K dei3ada em um es$ado B)LL. 0or padroM os valores em seu ve$or de dados so inseridos usando par1me$ros. ?sso reduz o ris'o de al.uns $ipos de aler$as de se.uran>a. ;o'O no pre'isa apli'ar 'an'elamen$o * ou 'i$a>o, no ve$or de dados. ;o'O poderia pre'isar Aue os valores em seu ve$or de dados -ossem $ra$ados 'omo e3press4es SDLM 'aso no Aual elas no seriam 'i$adas. 0or padroM $odos os valores de dados passados 'omo li$erais so $ra$ados 'omo li$erais. 0ara espe'i-i'ar Aue o valor es$ na e3presso SDL e por$an$o no deve ser 'i$adoM passe o valor no ve$or de dados 'omo um ob8e$o do $ipo Zend!"b!=3pr ao invKs de um $e3$o simples. Exemplo 10.13. Dnclu#ndo express4es em uma tabela
<?php $data array" 'created_on' # ne! Zend_Db_5*pr"'.=<DA;5"+'+( 'bu/_description' # '4o)ethin/ !ron/'( 'bu/_status' # '25>' +; $db3#insert"'bu/s'( $data+;

10.1.&.2. :ecuperando um Calor 6erado #l.umas mar'as de 7"(:S supor$am '9aves primrias au$oin'remen$ais. )ma $abela de-inida
* T'an'elamen$oU -oi a -orma ado$ada para o $ermo Tes'apin.U Aue si.ni-i'a anular o e-ei$o de 'omando Aue 'ara'$eres espe'iais $em em 'on$eNdos li$erais (s$rin.s) 'om o uso da barra inver$ida (V). , T'i$a>oU aAuiM $radu>o do $ermo TAuo$in.UM Auer dizer des$a'ado 'om o uso de 'ara'$eres delimi$adoresM .eralmen$e apLs$ro-os.

15E1 *

desse modo .era um valor de '9ave primria au$oma$i'amen$e duran$e um ?BS=7T de uma nova lin9a. 5 valor de re$orno do mK$odo insert"+ no K o Nl$imo ?" inseridoM porAue a $abela pode no $er uma 'oluna au$oin'remen$al. #o invKs dissoM o valor de re$orno K o numero de lin9as a-e$adas (.eralmen$e 1). Se sua $abela K de-inida 'om uma '9ave primria au$oin'remen$alM vo'O pode '9amar o mK$odo last9nsert9d"+ depois da in'luso. =sse mK$odo re$orna o Nl$imo valor .erado no es'opo da 'one3o a$ual de ban'o de dados. Exemplo 10.17. Usando lastDnsertDd<= para uma c*a,e auto#ncremental
<?php $db3#insert"'bu/s'( $data+; // retorna o Plti)o Balor /erado por u)a coluna autoincre)ental. $id $db3#last9nsert9d"+;

#l.umas mar'as de ban'o de dados supor$am um ob8e$o seAWOn'ialM Aue .era valores Nni'os para servir 'omo '9aves primrias. 0ara supor$ar seAWOn'iasM o mK$odo last9nsert9d"+ a'ei$a dois ar.umen$os li$erais op'ionais. =sses ar.umen$os nomeiam a $abela e a 'olunaM assumindo Aue vo'O $em se.uido a 'onven>o de Aue uma seAWOn'ia K nomeada usando os nomes de $abela e 'oluna para os Auais a seAWOn'ia .era valoresM e um su-i3o T!seAU. ?sso K baseado na 'onven>o usada pelo 0os$.reSDL Auando nomeia seAWOn'ias para 'olunas S=7?#L. 0or e3emploM uma $abela Tbu.sU 'om 'oluna de '9ave primria Tbu.!idU usaria uma seAWOn'ia '9amada Rbu.s!bu.!id!seAR. Exemplo 10.1;. Usando lastDnsertDd<= para uma se2EFnc#a
<?php $db3#insert"'bu/s'( $data+; // retorna o Plti)o Balor /erado pela seqQRncia 'bu/s_bu/_id_seq'. $id $db3#last9nsert9d"'bu/s'( 'bu/_id'+; // de -or)a alternatiBa( retorna o Balor /erado pela seqQRncia 'bu/s_seq'. $id $db3#last9nsert9d"'bu/s'+;

Se o nome do seu ob8e$o de seAWOn'ia no se.ue essa 'onven>o de nomea>oM use em seu lu.ar o mK$odo last4equence9d"+. =sse mK$odo leva um ar.umen$o li$eral simplesM nomeando a seAWOn'ia li$eralmen$e. Exemplo 10.20. Usando lastAe2uenceDd<=
<?php $db3#insert"'bu/s'( $data+; // retorna o Plti)o Balor /erado pela seqQRncia 'bu/s_id_/en'. $id $db3#last4equence9d"'bu/s_id_/en'+;

1/E1 *

0ara mar'as de 7"(:S Aue no supor$am seAWOn'iasM in'luindo :+SDLM :i'roso-$ SDL ServerM e SDLi$eM os ar.umen$os para o mK$odo las$?nser$?d() so i.noradosM e o valor re$ornado K o valor .erado mais re'en$emen$e para AualAuer $abela por opera>4es ?BS=7T duran$e a 'one3o a$ual. 0ara essas mar'as de 7"(:SM o mK$odo las$SeAuen'e?d sempre re$orna null. (or 2ue n/o usar GAE9EC? 8AH<#d= F:58 tableGI #l.umas vezes essa 'onsul$a re$orna o valor de '9ave inserido mais re'en$emen$e na $abela. =n$re$an$oM essa $K'ni'a no K se.ura para usar em um ambien$e onde mNl$iplos 'lien$es es$o inserindo re.is$ros em um ban'o de dados. X possCvelM e por$an$o K possCvel de a'on$e'er even$ualmen$eM Aue ou$ro 'lien$e insira ou$ra lin9a no ins$an$e em$re a inser>o e3e'u$ada por sua apli'a>o 'lien$e e sua 'onsul$a para o valor de :#S(id). #ssim o valor re$ornado no iden$i-i'a a lin9a Aue vo'O inseriuM iden$i-i'a a lin9a inserida por al.um ou$ro 'lien$e. Bo 9 modo de saber Auando isso a'on$e'eu. )sar um modo de isolamen$o de $ransa>o -or$e $al 'omo Trepea$able readU pode mi$i.ar esse ris'oM mas al.umas mar'as de 7"(:S no supor$am o isolamen$o de $ransa>o reAuerido para issoM ou sua apli'a>o pode usar um isolamen$o de $ransa>o bai3o por pro8e$o. #lKm dissoM usar uma e3presso 'omo R:#S(id)Y1R para .erar um novo valor para uma '9ave primria no K se.uroM porAue dois 'lien$es poderiam -azer essa 'onsul$a simul$aneamen$eM e en$o ambos usam o mesmo valor 'al'ulado para sua prL3ima opera>o ?BS=7T. Todas as mar'as de 7"(:S -orne'em me'anismos para .erar valores Nni'osM e re$ornam o Nl$imo valor .erado. =sses me'anismos ne'essariamen$e $rabal9am -ora do es'opo de isolamen$o de $ransa>oM assim no 9 '9an'e de dois 'lien$es .erarem o mesmo valor e no 9 '9an'e Aue o valor .erado por ou$ro 'lien$e possa ser repor$ado para sua 'one3o de 'lien$e 'omo o Nl$imo valor .erado. 10.1.&.". Atual#$ando Dados ;o'O pode a$ualizar dados em uma $abela usando o mK$odo update"+ de um adap$ador. =sse mK$odo leva $rOs ar.umen$osP o primeiro K o nome da $abelaZ o se.undo K um ve$or asso'ia$ivo Aue mapeia 'olunas a serem al$eradas para novos valores para asso'iar a essas 'olunas. 5s valores no ve$or de dados so $ra$ados 'omo li$erais. ;e8a Se>o 1 .1.%.1M T?n'luindo "adosU para in-orma>4es sobre 'omo usar e3press4es SDL no ve$or de dados. 5 $er'eiro ar.umen$o K um li$eralM 'on$endo uma e3presso SDL Aue K usada 'omo 'ri$Krio para as lin9as a serem al$eradas. 5s valores e iden$i-i'adores nes$e ar.umen$o no so 'i$ados nem so-rem 'an'elamen$o. ;o'O K responsvel por .aran$ir Aue AualAuer 'on$eNdo din1mi'o se8a in$erpolado nesse li$eral de -orma se.ura. ;e8a Se>o 1 .1.5M T&i$ando ;alores e ?den$i-i'adoresU para mK$odos Aue a8udam vo'O a -azer isso. 5 valor de re$orno K o nNmero de lin9as a-e$adas pela opera>o de a$ualiza>o. =3emplo 1 .*1. #$ualizando lin9as 12E1 *

<?php $data array" 'updated_on' # '%''&3'O3%O'( 'bu/_status' # '69S5D' +; $n $db3#update"'bu/s'( $data( 'bu/_id

%'+;

Se vo'O omi$ir o $er'eiro ar.umen$oM en$o $odas as lin9as na $abela do ban'o de dados so a$ualizadas 'om os valores espe'i-i'ados no ve$or de dados. Se vo'O -orne'er um ve$or de li$erais 'omo $er'eiro ar.umen$oM esses li$erais sero unidos 'omo $ermos em uma e3presso separada por operadores A2D. Exemplo 10.22. Atual#$ando l#n*as usando um ,etor de express4es
<?php $data array" 'updated_on' # '%''&3'O3%O'( 'bu/_status' # '69S5D' +; $!hereMN Treported_by '/oo-y'T; $!hereMN Tbu/_status '7P52'T; $n $db3#update"'bu/s'( $data( $!here+; // A 4?8 resultante L, // =PDA;5 Tbu/sT 45; Tupdate_onT '%''&3'O3%O'( Tbu/_statusT // >H5<5 "Treported_byT '/oo-y'+ A2D "Tbu/_statusT '7P52'+

'69S5D'

10.1.&.&. Apa%ando Dados ;o'O pode apa.ar lin9as de uma $abela de ban'o de dados usando o mK$odo delete"+. =sse mK$odo leva dois ar.umen$osP o primeiro K um li$eral Aue nomeia a $abela. 5 se.undo ar.umen$o K um li$eral 'on$endo uma e3presso SDL Aue K usada 'omo 'ri$Krio para as lin9as a serem apa.adas. 5s valores e iden$i-i'adores nesse ar.umen$o no so 'i$ados nem so-rem 'an'elamen$o. ;o'O K responsvel por .aran$ir Aue AualAuer 'on$Kudo din1mi'o se8a in$erpolado nesse li$eral de modo se.uro. ;e8a Se>o 1 .1.5M T&olando ;alores e ?den$i-i'adores &i$adosU para mK$odos Aue a8udam vo'O a -azer isso. 5 valor de re$orno K o nNmero de lin9as a-e$adas pela opera>o de apa.amen$o. Exemplo 10.2". Apa%ando l#n*as
<?php $n $db3#delete"'bu/s'( 'bu/_id

O'+;

1@E1 *

Se vo'O omi$ir o se.undo ar.umen$oM o resul$ado K Aue $odas as lin9as no ban'o de dados so apa.adas. Se vo'O -orne'er um ve$or de li$erais 'omo se.undo ar.umen$oM esses li$erais sero unidos 'omo $ermos em uma e3presso separada por operadores A2D.

10.1.-. C#tando Calores e Ddent#!#cadores


Duando vo'O -orma 'onsul$as SDLM -reAWen$emen$e o'orre o 'aso em Aue vo'O pre'isa in'luir os valores de variveis 0I0 em e3press4es SDL. ?sso K um ris'oM porAue se o valor no li$eral 0I0 'on$iver 'er$os sCmbolosM $ais 'omo o sCmbolo de apLs$ro-oM isso poder resul$ar em uma SDL invlida. 0or e3emploM observe o desbalan'eamen$o de 'ara'$eres de apLs$ro-o na se.uin$e 'onsul$aP
$na)e T7'<eillyT; $sql T4585.; J 6<7M bu/s >H5<5 reported_by '$na)e'T; echo $sql; // 4585.; J 6<7M bu/s >H5<5 reported_by '7'<eilly'

5 pior K o ris'o de Aue $ais eAuCvo'os de 'Ldi.o possam ser e3plorados deliberadamen$e por uma pessoa Aue es$ $en$ando manipular a -un>o de sua apli'a>o web. Se eles podem espe'i-i'ar o valor de uma varivel 0I0 a$ravKs do uso de uma par1me$ro ITT0 ou ou$ro me'anismoM eles podem ser 'apaz de -azer suas 'onsul$as SDL -azerem 'oisas Aue vo'O no pre$endia para elasM $ais 'omo re$ornar dados para pessoas as Auais no devem $er privilK.io de lei$ura. =ssa K uma $K'ni'a sKria e mui$o di-undidaM 'on9e'ida 'omo TSDL ?n8e'$ionU (ve8a 9$$pPEEen.wikipedia.or.EwikiESDL!?n8e'$ion). # 'lasse Zend!"b #dap$er provO -un>4es 'onvenien$es para a8udar vo'O a reduzir vulnerabilidades a a$aAues SDL ?n8e'$ion em seu 'Ldi.o 0I0. # solu>o K apli'ar 'an'elamen$o em 'ara'$eres espe'iais $ais 'omo apLs$ro-os em valores 0I0 an$es Aue eles se8am in$erpolados em seus li$erais SDL. ?sso pro$e.e 'on$ra manipula>o a'iden$al e deliberada de li$erais SDL por variveis 0I0 Aue 'on$Km 'ara'$eres espe'iais. 10.1.-.1. Usando quote() 5 mK$odo quote"+ a'ei$a um simples ar.umen$oM um valor li$eral es'alar. =le re$orna o valor 'om 'ara'$eres espe'iais em es'apin. de uma -orma apropriada para o 7"(:S Aue vo'O es$ usandoM e 'er'ado por delimi$adores de valor li$eral. 5 delimi$ador de valor li$eral padro SDL K o apLs$ro-o ('). Exemplo 10.2&. Usando 2uote<=
<?php $na)e $db3#quote"T7'<eillyT+; echo $na)e; // '7U'<eilly' $sql T4585.; J 6<7M bu/s >H5<5 reported_by

$na)eT;

16E1 *

echo $sql; // 4585.; J 6<7M bu/s >H5<5 reported_by

'7U'<eilly'

Bo$e Aue o valor de re$orno de quote"+ in'lui os delimi$adores de apLs$ro-o 'er'ando o li$eral. ?sso K di-eren$e de al.umas -un>4es Aue realizam es'apin. de 'ara'$eres espe'iais mas no adi'ionam os delimi$adores de apLs$ro-oM por e3emplo m+sAl!real!es'ape!s$rin.(). ;alores podem pre'isar ser 'er'ados ou no por apLs$ro-osM de a'ordo 'om o 'on$e3$o de $ipo de dados SDL no Aual eles so usados. 0or ins$1n'iaM em al.umas mar'as de 7"(:SM um valor in$eiro no deve ser 'er'ado por apLs$ro-os 'omo um li$eral se ele K 'omparado 'om uma 'oluna ou e3presso do $ipo in$eiro. =m ou$ras palavrasM a lin9a a se.uir K um erro em al.umas implemen$a>4es de SDLM assumindo Aue int.olu)n $en9a um $ipo de dados 92;5:5<.
4585.; J 6<7M atable >H5<5 int.olu)n '$%O'

;o'O pode usar o se.undo ar.umen$o op'ional do mK$odo quote"+ para apli'ar apLs$ro-os sele$ivamen$e para o $ipo de dados SDL Aue vo'O espe'i-i'ar. Exemplo 10.2-. Usando 2uote<= com um t#po AJ9
<?php $Balue '$%OV'; $sql '4585.; J 6<7M atable >H5<5 int.olu)n . $db3#quote"$Balue( '92;5:5<'+;

'

&ada 'lasse Zend!"b!#dap$er 'odi-i'ou os nomes de $ipos de dados SDL numKri'os para a respe'$iva mar'a de 7"(:S. ;o'O pode $ambKm usar as 'ons$an$es Zend_Db,,92;_;@P5M Zend_Db,,A9:92;_;@P5M e Zend_Db,,687A;_;@P5 para es'rever 'Ldi.o em modo mais independen$e de 7"(:S. Zend!"b!Table espe'i-i'a $ipos SDL para quote"+ au$oma$i'amen$e Auando .era 'onsul$as SDL Aue -azem re-erOn'ia a 'olunas '9ave de $abela. 10.1.-.2. Usando quoteInto() 5 uso mais $Cpi'o de apLs$ro-os K in$erpolar uma varivel 0I0 em uma e3presso ou de'lara>o SDL. ;o'O pode usar o mK$odo quote9nto"+ para -azer isso em um passo. =sse mK$odo leva dois ar.umen$osP o primeiro ar.umen$o K um li$eral 'on$endo um sCmbolo de espa>o reservado para par1me$ro ([)M e o se.undo ar.umen$o K o valor ou varivel 0I0 Aue deve ser subs$i$uCda pelo sCmbolo de espa>o reservado. 5 sCmbolo de espa>o reservado K o mesmo sCmbolo usado por mui$as mar'as de 7"(:S para * E1 *

par1me$ros posi'ionaisM mas o mK$odo quote9nto"+ sL emula par1me$ros de 'onsul$a. 5 mK$odos simplesmen$e in$erpola o valor em um li$eralM apli'a 'an'elamen$o a 'ara'$eres espe'iaisM e apli'a apLs$ro-os ao redor do mesmo. 0ar1me$ros de 'onsul$a verdadeiros man$Km a separa>o en$re o li$eral SDL e os par1me$ros 'omo a de'lara>o K analisada .rama$i'almen$e no servidor 7"(:S. Exemplo 10.21. Usando 2uoteDnto<=
<?php $sql $db3#quote9nto"T4585.; J 6<7M bu/s >H5<5 reported_by echo $sql; // 4585.; J 6<7M bu/s >H5<5 reported_by '7U'<eilly'

?T( T7'<eillyT+;

;o'O pode usar o $er'eiro par1me$ro op'ional de quote9nto"+ para espe'i-i'ar o $ipo de dados SDL. Tipos de dados numKri'os no so 'er'ados por apLs$ro-osM e ou$ros $ipos so 'er'ados. Exemplo 10.23. Usando 2uoteDnto<= com um t#po AJ9
<?php $sql $db3#quote9nto"T4585.; J 6<7M bu/s >H5<5 bu/_id echo $sql; // 4585.; J 6<7M bu/s >H5<5 reported_by $%OV

?T( '$%OV'( '92;5:5<'+;

10.1.-.". Usando quoteIdentifier() ;alores no so a Nni'a par$e da sin$a3e SDL Aue pode pre'isar ser varivel. Se vo'O usa variveis 0I0 para nomear $abelasM 'olunasM ou ou$ros iden$i-i'adores em suas de'lara>4es SDLM vo'O pode pre'isar 'olo'ar apLs$ro-os nesses li$erais $ambKm. 0or padroM iden$i-i'adores SL $em re.ras de sin$a3e i.uais ao 0I0 e a maioria das lin.ua.ens de pro.rama>o. 0or e3emploM iden$i-i'adores no devem 'on$er espa>osM 'er$os 'ara'$eres espe'iais ou pon$ua>oM ou 'ara'$eres in$erna'ionais. TambKm 'er$as palavras so reservadas para a sin$a3e SDLM e no devem ser usadas 'omo iden$i-i'adores. =n$re$an$oM SDL $em uma 'ara'$erCs$i'a '9amada identificadores delimitadosM Aue permi$e amplas es'ol9as para a .ra-ia de iden$i-i'adores. Se vo'O envolver um iden$i-i'ador SD\ nos $ipos apropriados de apLs$ro-osM vo'O pode usar iden$i-i'adores 'om .ra-iass Aue deveriam ser invlidas sem os apLs$ro-os. ?den$i-i'adores delimi$ados podem 'on$er espa>osM pon$ua>oM ou 'ara'$eres in$erna'ionais. ;o'O $ambKm pode usar palavras reservadas SDL se Auiser envolvO<los. 5 mK$odo quote9denti-ier"+ $rabal9a 'om quote"+M mas apli'a o delimi$ador de iden$i-i'a>o de 'ara'$eres para o li$eral de a'ordo 'om o $ipo de adap$ador. 0or e3emploM SDL padro usa aspas (T) para delimi$adores de iden$i-i'adorM e a maioria das mar'as de 7"(:S usam esse sCmbolo. :+SDL usa 'rase (]) por padro. 5 mK$odo quote9denti-ier"+ $ambKm apli'a es'apin. de 'ara'$eres espe'iais de den$ro do ar.umen$o li$eral. *1E1 *

Exemple 10.27. Usando 2uoteDdent#!#er<=


<?php // nWs pode)os ter u)a tabela cu1o no)e L u)a palaBra3reserBada 4?8 $table2a)e $db3#quote9denti-ier"TorderT+; $sql T4585.; J 6<7M $table2a)eT; echo $sql // 4585.; J 6<7M TorderT

?den$i-i'adores delimi$ados SDL so sensCveis a 'ai3aM e3'e$o iden$i-i'adores no 'er'ados por apLs$ro-os. 0or$an$oM se vo'O usa iden$i-i'adores delimi$adosM vo'O deve usar a .ra-ia do iden$i-i'ador e3a$amen$e 'omo es$ armazenado em seu esAuemaM in'luindo a 'ai3a das le$ras. Ba maioria dos 'asos onde SDL K .erado de den$ro das 'lasses Zend!"bM padro K Aue $odos os iden$i-i'adores se8am delimi$ados au$oma$i'amen$e. ;o'O pode mudar esse 'ompor$amen$o 'om a op>o Zend_Db,,A=;7_?=7;5_9D52;9695<4. =spe'i-iAue isso Auando ins$an'iar o adap$ador. ;e8a =3emplo 1 ./M T0assando a op>o au$o<Auo$in. para o -a'$or+U.

10.1.1. Controlando ?ransa.4es de Banco de Dados


(an'os de dados de-inem $ransa>4es 'omo unidades lL.i'as de $rabal9o Aue podem ser subme$idas ou des'ar$adas 'omo uma al$era>o simplesM mesmo Aue elas operem sobre mNl$iplas $abelas. Todas as 'onsul$as a um ban'o de dados so e3e'u$adas den$ro do 'on$e3$o de uma $ransa>oM mesmo se o driver do ban'o de dados os .eren'ia impli'i$amen$e. ?sso K '9amado modo de auto-commitM no Aual o driver de ban'o de dados 'ria uma $ransa>o para 'ada de'lara>o Aue vo'O e3e'u$aM e e-e$iva essa $ransa>o depois Aue sua de'lara>o SDL $en9a sido e3e'u$ada. 0or padroM $odas as 'lasses adap$adoras operam em modo de au$o<'ommi$. #l$erna$ivamen$eM vo'O pode espe'i-i'ar o inC'io e a resolu>o de uma $ransa>oM e assim 'on$rolar Auan$as 'onsul$as SDL so in'luCdas em um .rupo simples Aue K e-e$ivado (ou des'ar$ado) 'omo uma opera>o simples. )se o mK$odo be/in;ransaction"+ para ini'iar uma $ransa>o. "e'lara>4es SDL subseAWen$es sero e3e'u$adas no 'on$e3$o da mesma $ransa>o a$K Aue vo'O as resolva e3pli'i$amen$e. 0ara resolver a $ransa>oM use o mK$odo co))it"+ ou rollAacX"+. 5 mK$odo co))it"+ mar'a al$era>4es -ei$as enAuan$o sua $ransa>o K e-e$ivadaM o Aue si.ni-i'a Aue os e-ei$os dessas al$era>4es sero e3ibidos em 'onsul$as rodando em ou$ras $ransa>4es. 5 mK$odo rollAacX"+ -az o opos$oP ele des'ar$a as al$era>4es -ei$as duran$e sua $ransa>o. #s mudan>as so e-e$ivamen$e des-ei$asM e o es$ado dos dados re$orna a 'omo ele era an$es de vo'O 'ome>ar sua $ransa>o. =n$re$an$oM des'ar$ar sua $ransa>o no $em e-ei$o sobre mudan>as -ei$as por ou$ras $ransa>4es rodando 'on'orren$emen$e. "epois Aue vo'O resolve essa $ransa>oM Zend_Db_Adapter re$orna ao modo au$o<'ommi$ a$K vo'O '9amar be/in;ransaction"+ novamen$e.

**E1 *

Exemplo 10.2;. 6erenc#ando uma transa./o para %arant#r cons#stFnc#a


<?php // 9nicie u)a transaYFo e*plicita)ente. $db3#be/in;ransaction"+; try C // ;entatiBa de e*ecutar u)a ou )ais consultas, $db3#query"...+; $db3#query"...+; $db3#query"...+; // 4e tudo deu certo( e-etiBa a transaYFo e todas as )udanYas // sFo e-etiBadas de u)a BeE. $db3#co))it"+; D catch "5*ception $e+ C // 4e qualquer u)a das consultas -alhar e lanYar u)a e*ceYFo( // nWs quere)os descartar a transaYFo inteira( reBertendo // as )udanYas -eitas na transaYFo( )es)o que essas tenha) dado certo. // Assi)( todas as )udanYas sFo e-etiBadas 1untas( ou nenhu)a L e-etiBada. $db3#rollAacX"+; echo $e3#/etMessa/e"+; D

10.1.3. 9#stando e Descre,endo ?abelas


5 mK$odo list;ables"+ re$orna um ve$or de li$eraisM denominando $odas as $abelas no ban'o de dados a$ual. 5 mK$odo describe;able"+ re$orna uma ve$or asso'ia$ivo de me$adados sobre uma $abela. =spe'i-iAue o nome da $abela 'omo um li$eral no primeiro ar.umen$o para esse mK$odo. 5 se.undo ar.umen$o K op'ionalM e nomeia o esAuema no Aual a $abela e3is$e. #s '9aves do ve$or asso'ia$ivo re$ornado so as 'olunas da $abela. 5s valores 'orresponden$es para 'ada 'oluna $ambKm K um ve$or asso'ia$ivoM 'om as se.uin$es '9aves e valoresP ?abela 10.1. Campos de metadados retornados por descr#be?able<= C*a,e S&I=:#!B#:= T#(L=!B#:= &5L):B!B#:= ?#po (s$rin.) (s$rin.) (s$rin.) Descr#./o Bome do esAuema de ban'o de dados no Aual a $abela e3is$e. Bome da $abela para o Aual essa 'oluna per$en'e Bome da 'oluna.

&5L):B!05S?T? (in$e.er) 0osi>o ordinal da 'oluna na $abela. 5B "#T#!TJ0= "=F#)LT B)LL#(L= (s$rin.) (s$rin.) Bome Aue o 7"(:S d para o $ipo de dados da 'oluna ;alor padro para a 'olunaM se 9ouver.

(boolean True se a 'oluna a'ei$a SDL B)LLsM e -alse se a 'oluna $em uma *,E1 *

C*a,e

?#po )

Descr#./o res$ri>o B5T B)LL. &omprimen$o ou $aman9o da 'oluna 'omo repor$ado pelo 7"(:S.

L=BGTI S&#L= 07=&?S?5B )BS?GB=" 07?:#7J

(in$e.er)

(in$e.er) =s'ala do $ipo SDL B):=7?& ou "=&?:#L. (in$e.er) 0re'iso do $ipo SDL B):=7?& ou "=&?:#L. (boolean True se um $ipo baseado em in$eiro K repor$ado 'omo ) )BS?GB=". (boolean True se a 'oluna K par$e da '9ave primria dessa $abela. )

07?:#7J!05S?T? (in$e.er) 0osi>o ordinal (baseada em 1) da 'oluna na '9ave primria. 5B ?"=BT?TJ (boolean True se a 'oluna usa um valor au$o.erado. )

Se no e3is$e $abela Aue 'oin'ida 'om nome de $abela e 'om o nome de esAuema op'ional espe'i-i'adoM en$o describe;able"+ re$orna um ve$or vazio.

10.1.7. Fec*ando um Conex/o


Bormalmen$e no K ne'essrio -e'9ar uma 'one3o de ban'o de dados. 0I0 au$oma$i'amen$e elimina $odos os re'ursos e -inaliza uma reAuisi>o. =3$ens4es de ban'os de dados so desen9adas para -e'9ar a 'one3o assim Aue a re-erOn'ia para o ob8e$o de re'urso se8a eliminada. =n$re$an$oM se vo'O $iver um s'rip$ 0I0 de lon.a dura>o Aue ini'ia mui$as 'one34es de ban'o de dadosM vo'O pode pre'isar -e'9ar a 'one3oM para evi$ar a e3aus$o da 'apa'idade de seu servidor 7"(:S. ;o'O pode usar o mK$odo close.onnection"+ do adap$ador para -e'9ar e3pli'i$amen$e a 'one3o de ban'o de dados sub8a'en$e. Exemplo 10."0. Fec*ando uma conex/o de banco de dados
<?php $db3#close.onnection"+;

Zend_Db suporta conex4es pers#stentesI 5 uso de 'one34es persis$en$es no K supor$ado ou mesmo en'ora8ado em Zend!"b. )sar 'one34es persis$en$es pode 'ausar um e3'esso de 'one34es no servidor 7"(:SM o Aue 'ausa mais problemas do Aue AualAuer .an9o de per-orman'e Aue vo'O possa $er adAuirido pela redu>o da sobre'ar.a de 'riar 'one34es.

*%E1 *

&one34es de ban'o de dados $em es$ado. ?s$o KM al.uns ob8e$os no servidor 7"(:S e3is$em no es'opo da sesso. =3emplos so bloAueiosM variveis de usurioM $abelas $emporriasM e in-orma>o sobre as 'onsul$as e3e'u$adas mais re'en$emen$eM $ais 'omo lin9as a-e$adasM e a Nl$imo valor de id .erado. Se vo'O usar 'one34es persis$en$esM sua apli'a>o poderia a'essar dados invlidos ou privile.iados Aue -oram 'riados em uma reAuisi>o 0I0 an$erior.

10.1.;. :odando 5utras Declara.4es de Banco de Dados


0ode 9aver 'asos em Aue vo'O pre'ise a'essar o ob8e$o de 'one3o dire$amen$eM 'omo -orne'ido pela e3$enso de ban'o de dados 0I0. #l.umas dessas e3$ens4es podem o-ere'er 'ara'$erCs$i'as Aue no so 'ober$as por mK$odos da 'lasse Zend!"b!#dap$er!#bs$ra'$. 0or e3emploM $odas as de'lara>4es SDL Aue rodam por Zend!"b so preparadasM en$o e3e'u$adas. =n$re$an$oM al.umas 'ara'$erCs$i'as de ban'os de dados so in'ompa$Cveis 'om de'lara>4es preparadas. "e'lara>4es ""L 'omo &7=#T= e #LT=7 no podem ser preparados em :+SDL. "e'lara>4es SDL $ambKm no se bene-i'iam do :+SDL Duer+ &a'9eM an$erior ao :+SDL 5.1.12. # maioria das e3$ens4es de ban'os de dados -orne'em um mK$odo para e3e'u$ar de'lara>4es SDL sem a prepara>o dos mesmos. 0or e3emploM em 0"5M esse mK$odo K e*ec"+. ;o'O pode a'essar o ob8e$o de 'one3o na e3$enso 0I0 dire$amen$e usando .e$&onne'$ion(). Exemplo 10."1. :odando uma declara./o n/o0preparada em um adaptador (D5
<?php $result

$db3#/et.onnection"+3#e*ec"'D<7P ;AA85 bu/s'+;

"e modo similarM vo'O pode a'essar ou$ros mK$odos ou propriedades Aue so espe'C-i'as para e3$ens4es de ban'os de dados 0I0. =s$e8a a$en$oM en$re$an$oM Aue ao -azer isso vo'O pode res$rin.ir sua apli'a>o F in$er-a'e -orne'ida pela e3$enso para uma mar'a espe'C-i'a de 7"(:S. =m vers4es -u$uras de Zend!"bM 9aver opor$unidades de adi'ionar pon$os de en$rada de mK$odo para -un'ionalidades Aue so 'omuns Fs e3$ens4es de ban'o de dados supor$adas pelo 0I0. ?sso no a-e$ar a 'ompa$ibilidade re$rL.rada.

10.1.10. Notas sobre Adaptadores EspecK!#cos


=s$a se>o lis$a di-eren>as en$re as 'lasses adap$adoras 'om as Auais vo'O deve -i'ar a$en$o. 10.1.10.1. DB8 DB2

=spe'iAue esse adap$ador pelo mK$odo -a'$or+() 'om o nome Q"b*Q. =sse adap$ador usa a e3$enso 0I0 ibm!db*. *5E1 *

?(: "(* supor$a $an$o '9aves seAWen'iais Auando au$oin'remen$ais. 0or$an$o os ar.umen$os para o last9nsert9d"+ so op'ionais. Se vo'O no der nen9um ar.umen$oM o adap$ador re$orna o Nl$imo valor .erado para uma '9ave au$oin'remen$al. Se vo'O der ar.umen$osM o adap$ador re$orna o Nl$imo valor .erado pela seAWen'ia nomeada de a'ordo 'om a 'onven>o Qtable!column!seAQ.

10.1.10.2. 8yAJ9#

=spe'i-iAue esse adap$ador pelo mK$odo -actory"+ 'om o nome Q:+sAliQ. =sse adap$ador u$iliza a e3$enso 0I0 m+sAli. :+SDL no supor$a seAWen'iasM assim last9nsert9d"+ i.norada seus ar.umen$os e sempre re$orna o Nl$imo valor .erado por uma '9ave de au$oin'remen$o. 5 mK$odo last4equence9d"+ re$orna null.

10.1.10.". 5racle

=spe'i-iAue esse adap$ador pelo mK$odo -actory"+ 'om o nome Q5ra'leQ. =sse adap$ador usa a e3$enso 0I0 o'i@. 5ra'le no supor$a '9aves au$oin'remen$aisM assim vo'O deve espe'i-i'ar o nome de uma seAWen'ia para last9nsert9d"+ ou last4equence9d"+. # e3$enso 5ra'le n supor$a par1me$ros posi'ionais. ;o'O deve usar par1me$ros nomeados. #$ualmen$e a op>o Zend_Db,,.A45_678D92: no K supor$ada pelo adap$ador 5ra'le. 0ara usar es$a op>o 'om 5ra'leM vo'O deve usar o adap$ador 0"5 5&?.

10.1.10.&. (D5 para DB8 DB2 e Dn!orm#x Dynam#c Aer,er <DDA=


=spe'i-iAue esse adap$ador para o mK$odo -actory"+ 'om o nome Q0do!?bmQ. =sse adap$ador usa as e3$ens4es 0I0 pdo e pdo!ibm. ;o'O deve usar pelo menos a e3$enso 0"5!?(: verso 1.*.*. Se vo'O $em um verso mais re'en$e dessa e3$ensoM vo'O deve a$ualizar a e3$enso 0"5!?(: da 0=&L.

10.1.10.-. (D5 8#croso!t AJ9 Aer,er


=spe'i-iAue esse adap$ador para o mK$odo -actory"+ 'om o nome Q0do!:ssAlQ. =sse adap$ador usa as e3$ens4es 0I0 pdo e pdo!mssAl. :i'roso-$ SDL Server no supor$a seAWen'iasM assim last9nsert9d"+ i.nora seus */E1 *

ar.umen$os e sempre re$orna o Nl$imo valor .erado para uma '9ave au$oin'remen$al. 5 mK$odo last4equence9d"+ re$ornal null.

Zend!"b!#dap$er!0do!:ssAl 'on-i.ura ?=7;5D_9D52;9695< 72 imedia$amen$e depois de 'one'$ar em um ban'o de dados SDL Server. =la -az o driver usar o sCmbolo delimi$ador iden$i-i'ador padro SDL (T) ao invKs da sin$a3e proprie$ria sAuare<bra'ke$s ('ol'9e$es) Aue o SDL Server usa para iden$i-i'adores de delimi$a>o. ;o'O pode espe'i-i'ar pdo;ype 'omo uma '9ave no ve$or de op>4es. 5 valor pode ser RmssAlR (o padro)M RdblibRM R-ree$dsRM ou Rs+baseR. =ssa op>o a-e$a o pre-i3o "SB Aue o adap$ador usa Auando 'ons$rLi o li$eral "SB. Tan$o R-ree$dsR Auan$o Rs+baseR impli'am em um pre-i3o de Rs+basePRM o Aual K usado para o 'on8un$o de biblio$e'as FreeT"S. ;e8a $ambKm 9$$pPEEwww.p9p.ne$EmanualEenEre-.pdo<dblib.'onne'$ion.p9p para mais in-orma>4es sobre os pre-i3os "SB usados nesse driver.

10.1.10.1. (D5 8yAJ9


=spe'i-iAue esse adap$ador para o mK$odo -actory"+'om o nome Q0do!:+sAlQ. =sse adap$ador usa as e3$ens4es 0I0 pdo e pdo!m+sAl. :+SDL no supor$a seA^n'iasM assim last9nsert9d"+ i.nora seus ar.umen$os e sempre re$orna o Nl$imo valor .erado para uma '9ave au$oin'remen$al. 5 mK$odo last4equence9d"+ re$orna null.

10.1.10.3. (D5 5racle


=spe'i-iAue esse adap$ador para o mK$odo -actory"+ 'om o nome Q0do!5'iQ. =sse adap$ador usa as e3$ens4es 0I0 pdo e pdo!o'i. 5ra'le no supor$a '9aves au$oin'remen$aisM assim vo'O deve espe'i-i'ar o nome de uma seA^n'ia para last9nsert9d"+ ou last4equence9d"+.

10.1.10.7. (D5 (ost%reAJ9


=spe'i-iAue esse adap$ador para o me$Ldo -actory"+ 'om o nome Q0do!0.sAlQ. =sse adap$ador usa as e3$ens4es 0I0 pdo e pdo!p.sAl. 0os$.reSDL supor$a $an$o seAWen'ias Auan$o '9aves au$oin'remen$ais. 0or$an$o os ar.umen$os para last9nsert9d"+ so op'ionais. Se vo'O no -orne'er ar.umen$osM o adap$ador re$orna o Nl$imo valor .erador para uma '9ave au$oin'remen$al. Se vo'O -orne'er ar.umen$osM o adap$ador re$ornar o Nl$imo valor .erado pela seA^n'ia nomeada de a'ordo 'om a 'onven>o Qtable!column!seAQ.

*2E1 *

10.1.10.;. (D5 AJ9#te


=spe'i-iAue esse adap$ador para o mK$odo -actory"+ 'om o nome Q0do!SAli$eQ. =sse adap$ador usa as e3$ens4es 0I0 pdo e pdo!sAli$e. SDLi$e no supor$a seAWen'iasM assim last9nsert9d"+ i.nora seus ar.umen$os e sempre re$orna o Nl$imo valor .erado para uma '9ave au$oin'remen$al. 5 mK$odo last4equence9d"+ re$orna null. 0ara 'one'$ar ao ban'o de dados SDLi$e*M espe'i-iAue 'dsnpre-i*' #'sqlite%' no ve$or de par1me$ros Auando 'riar uma ins$1n'ia do adap$ador 0do!SAli$e. 0ara 'one'$ar<se a um ban'o de dados SDLi$e em memLriaM espe'i-iAue 'dbna)e' #',)e)ory,' no ve$or de par1me$ros Auando 'riar uma ins$1n'ia do adap$ador 0do!SAli$e. ;ers4es an$eriores do driver SDLi$e para 0I0 no pare'em supor$ar os 'omandos 07#G:#% ne'essrios para .aran$ir Aue nome de 'oluna 'uros sero usados nos 'on8un$os de resul$ado. Se vo'O $iver problemas em Aue seus 'on8un$os de resul$ado so devolvidos 'om '9aves do -ormulrio R$ablename.'olumnnameR Auando vo'O -az uma 'onsul$a de 8un>oM en$o vo'O deve a$ualizar para a verso a$ual do 0I0.

10.1.10.10. F#reb#rdLDnterbase

=sse adap$ador usa a e3$enso 0I0 p9p!in$erbase. FirebirdEin$erbase no supor$a '9aves au$oin'remen$aisM assim vo'O deve espe'i-i'ar o nome da seAWen'ia para last9nsert9d"+ ou last4equence9d"+. #$ualmen$e a op>o Zend_Db,,.A45_678D92: no K supor$ada pelo adap$ador FirebirdEin$erbase. ?den$i-i'adores sem apLs$ro-os so au$oma$i'amen$e devolvidos em 'ai3a al$a.

10.2. Zend_Db_Atatement
=m adi>o a mK$odos 'onvenien$es $ais 'omo -etchAll"+ e insert"+ do'umen$ados em Se>o 1 .1M TZend!"b!#dap$erUM vo'O pode usar um ob8e$o de de'lara>o para .an9ar mais op>4es para rodar 'onsul$as e en'on$rar 'on8un$os de resul$ado. =ssa se>o des'reve 'omo ob$er uma ins$1n'ia de um ob8e$o de de'lara>oM e 'omo usar seus mK$odos. Zend!"b!S$a$emen$ K baseado no ob8e$o 0"5S$a$emen$ ob8e'$ da e3$enso 0I0 "a$a 5b8e'$s.

% "e'lara>o SDL espe'ial usada para modi-i'ar a opera>o da biblio$e'a SDLi$e ou para 'onsul$ar a biblio$e'a para dados in$ernos Aue no se8am de $abelas.

*@E1 *

10.2.1. Cr#ando uma Declara./o


Tipi'amen$e um ob8e$o de de'lara>o K devolvido pelo mK$odo query"+ da 'lasse adap$adora. =sse mK$odo K um modo .eral para preparar AualAuer de'lara>o SDL. 5 primeiro ar.umen$o K um li$eral 'on$endo uma de'lara>o SDL. 5 se.undo ar.umen$o op'ional K um ve$or de valores para ser 'ombinado aos espa>os reservados para par1me$ros no li$eral SDL. Exemplo 10."2. Cr#ando um ob'eto declara./o AJ9 com 2uery<=
<?php $st)t '(

$db3#query"'4585.; J 6<7M bu/s >H5<5 reported_by array"'/oo-y'( '69S5D'++;

? A2D bu/_status

5 ob8e$o de'lara>o 'orresponde F de'lara>o SDL Aue -oi preparadaM e e3e'u$ada uma vez 'om os valores asso'iados espe'i-i'ados. Se a de'lara>o -oi uma 'onsul$a S=L=&T ou ou$ro $ipo de de'lara>o Aue re$orne um 5b8e$o 7owse$M ele ela es$ar pron$a a.ora para bus'ar resul$ados. ;o'O pode 'riar uma de'lara>o 'om seu 'ons$ru$orM mas isso K o uso menos $Cpi'o. Bo 9 mK$odo -a'$or+ para 'riar es$e ob8e$oM assim vo'O pre'isa 'arre.ar a 'lasse de de'lara>o espe'C-i'a e '9amar seu 'ons$ru$or. 0asse o ob8e$o adap$ador 'omo primeiro ar.umen$oM e um li$eral 'on$endo uma de'lara>o SDL 'omo se.undo ar.umen$o. # de'lara>o K preparadaM mas no e3e'u$ada. Exemplo 10."". Usando um construtor de declara./o AJ9
<?php require_once 'Zend/Db/4tate)ent/Mysqli.php'; $sql '4585.; J 6<7M bu/s >H5<5 reported_by ? A2D bu/_status $st)t ne! Zend_Db_4tate)ent_Mysqli"$db( $sql+;

?';

10.2.2. Executando uma Declara./o


;o'O pre'isa e3e'u$ar um ob8e$o de de'lara>o se vo'O 'ri<lo usando seu 'ons$ru$orM ou se vo'O Auiser e3e'u$ar o mesmo ar.umen$o mNl$iplas vezes. )se o mK$odo e*ecute"+ do ob8e$o de de'lara>o. 5 ar.umen$o simples K um ve$or de valores a ser 'ombinado aos espa>os reservados para par1me$ros na de'lara>o. Se vo'O usar parmetros posicionaisM ou aAueles Aue so mar'ados 'om um sCmbolo mar'ador de in$erro.a>o (?)M passe os valores de 'ombina>o em um ve$or simples. Exemplo 10."&. Executando uma declara./o com par)metros pos#c#ona#s

*6E1 *

<?php $sql '4585.; J 6<7M bu/s >H5<5 reported_by ? A2D bu/_status $st)t ne! Zend_Db_4tate)ent_Mysqli"$db( $sql+; $st)t3#e*ecute"array"'/oo-y'( '69S5D'++;

?';

Se vo'O usar parmetros nomeadosM ou aAueles Aue so indi'ados por um iden$i-i'ador li$eral pre'edido por um 'ar$er de dois pon$os (P)M passe os valores de 'ombina>o em um ve$or asso'ia$ivo. #s '9aves des$e ve$or devem 'asar 'om os nomes de par1me$ro. Exemplo 10."-. Executando uma declara./o com par)metros nomeados
<?php $sql '4585.; J 6<7M bu/s >H5<5 reported_by ,reporter A2D bu/_status s'; $st)t ne! Zend_Db_4tate)ent_Mysqli"$db( $sql+; $st)t3#e*ecute"array"',reporter' # '/oo-y'( ',status' # '69S5D'++;

,statu

"e'lara>4es 0"5 supor$am $an$o par1me$ros posi'ionais Auan$o par1me$ros nomeadosM mas no ambos os $ipos em uma de'lara>o SDL simples. #l.umas das 'lasses Zend!"b!S$a$emen$ para e3$ens4es no<0"5 podem supor$ar somen$e um $ipo de par1me$ro ou ou$ro.

10.2.". Buscando :esultados de uma Declara./o SELECT


;o'O pode '9amar mK$odos a par$ir do ob8e$o de de'lara>o para re'uperar lin9as das de'lara>4es SDL Aue produzem 'on8un$os de resul$ados. S=L=&TM SI5HM "=S&7?(= e =S0L#?B so e3emplos de de'lara>4es Aue produzem um 5b8e$o 7owse$. ?BS=7TM )0"#T=M e "=L=T= so e3emplos de de'lara>4es Aue no produzem um 5b8e$o 7owse$. ;o'O pode e3e'u$ar as Nl$imas de'lara>4es SDL Aue usaram Zend!"b!S$a$emen$M mas vo'O no pode '9amar mK$odos para bus'ar lin9as de resul$ados das primeiras. 10.2.".1. Buscando uma 9#n*a A#mples de um 5b'eto :o+set 0ara re'uperar uma lin9a do 5b8e$o 7owse$M use o mK$odo -etch"+ do ob8e$o de de'lara>o. Todos os $rOs ar.ume$nos desse mK$odo so op'ionaisP

Fetc* style K o primeiro ar.umen$o. =le 'on$rola a es$ru$ura na Aual a lin9a K devolvida. ;e8a Se>o 1 .1.,.*M T#l$erando o Fe$'9 :odeU para uma des'ri>o dos valores vlidos e os 'orresponden$es -orma$os de dados. Cursor or#entat#on K o se.undo ar.umen$o. 5 padro K Zend!"bPPF=T&I!57?!B=STM Aue simplesmen$e si.ni-i'a Aue 'ada '9amada a -etch"+ re$orna a prL3ima lin9a no 5b8e$o 7owse$M na ordem re$ornada pelo 7"(:S.

, E1 *

5!!set K o $er'eiro ar.umen$o. Se a orien$a>o do 'ursor -or Zend!"bPPF=T&I!57?!#(SM en$o o nNmero de deslo'amen$o K o nNmero ordinal da lin9a a ser re$ornada. Se a orien$a>o do 'ursos -or Zend!"bPPF=T&I!57?!7=LM en$o o nNmero de deslo'amen$o K rela$ivo F posi>o do 'ursor an$es de -etch"+ ser '9amado.

-etch"+ re$orna -alse se $odas as lin9as do 5b8e$o 7owse$ -orem lo'alizadas. Exemplo 10."1. Usando !etc*<= em um loop
<?php $st)t $db3#query"'4585.; J 6<7M bu/s'+; !hile "$ro! $st)t3#-etch"++ C echo $ro!M'bu/_description'N; D

;e8a $ambKm 0"5S$a$emen$PP-e$'9(). 10.2.".2. Buscando um 5b'eto :o+set Completo 0ara re'uperar $odas as lin9as de 'um 5b8e$o 7owse$ em um passoM use o mK$odo -etchAll"+. ?sso K eAuivalen$e a '9amar o mK$odo -etch"+ em um loop e re$ornar $odas as lin9as em um ve$or. 5 mK$odo -etchAll"+ a'ei$a dois ar.umen$os. 5 primeiro K o es$ilo de bus'aM 'omo des'ri$o a'imaM e o se.undo indi'a o nNmero de 'olunas a serem re$ornadasM Auando o es$ilo de bus'a K Zend!"bPPF=T&I!&5L):B. Exemplo 10."3. Usando !etc*All<=
<?php $st)t $db3#query"'4585.; J 6<7M bu/s'+; $ro!s $st)t3#-etchAll"+; echo $ro!sM'NM'bu/_description'N;

;e8a $ambKm 0"5S$a$emen$PP-e$'9#ll(). 10.2.".". Alterando o Fetc* 8ode 0or padroM o ob8e$o de de'lara>o re$orna lin9as do 5b8e$o 7owse$ 'omo ve$ores asso'ia$ivosM Aue mapeiam nomes 'olunas para valores de 'olunas. ;o'O pode espe'i-i'ar um -orma$o di-eren$e para a 'lasse de de'lara>o re$ornar lin9asM e3a$amen$e 'omo vo'O pode -azer na 'lasse adap$adora. ;o'O pode usar o mK$odo set6etchMode"+ do ob8e$o de de'lara>o para espe'i-i'ar o -e$'9 mode. =spe-i'iAue o -e$'9 mode usando as 'ons$an$es da 'lasse Zend!"b F=T&I!#SS5&M F=T&I!B):M F=T&I!(5TIM F=T&I!&5L):BM e F=T&I!5(G. ;e8a a Se>o 1 .1.,.*M ,1E1 *

T#l$erando o Fe$'9 :odeU para mais in-orma>4es sobre esses modos. &9amadas subseAWen$es para os mK$odos de de'lara>o -etch"+ ou -etchAll"+ usam o -e$'9 mode Aue vo'O espe'i-i'ar. Exemplo 10."7. Con!#%urando o !etc* mode
<?php $st)t $db3#query"'4585.; J 6<7M bu/s'+; $st)t3#set6etchMode"Zend_Db,,65;.H_2=M+; $ro!s $st)t3#-etchAll"+; echo $ro!sM'NM'N;

;e8a $ambKm 0"5S$a$emen$PPse$Fe$'9:ode(). 10.2.".&. Buscando uma Coluna A#mples de um 5b'eto :o+set 0ara re$ornar uma 'oluna simples da prL3ima lin9a de um 5b8e$o 7owse$M use -etch.olu)n"+. 5 ar.umen$o op'ional K o Cndi'e in$eiro da 'olunaM e seu padro K . =sse mK$odo re$orna um valor es'alarM ou -alse se $odas as lin9as do 5b8e$o 7owse$ $iverem sido bus'adas. Bo$e Aue esse mK$odo opera de -orma di-eren$e do mK$odo-etch.ol"+ da 'lasse adap$adora. 5 mK$odo -etch.olu)n"+ de uma de'lara>o re$orna um valor simples de uma lin9a. 5 mK$odo -etch.ol"+ de um adap$ador re$orna um ve$or de valoresM ob$ido da primeira 'oluna de $odas as lin9as do 5b8e$o 7owse$. Exemplo 10.";. Usando !etc*Column<=
<?php $st)t $db3#query"'4585.; bu/_id( bu/_description( bu/_status 6<7M bu/s'+; $bu/_status $st)t3#-etch.olu)n"%+;

;e8a $ambKm 0"5S$a$emen$PP-e$'9&olumn(). 10.2.".-. Buscando uma 9#n*a como um 5b'eto 0ara re'uperar uma lin9a de um 5b8e$o 7owse$ es$ru$urado 'omo um ob8e$oM use o -etch7b1ect"+. =sse mK$odo leva dois ar.umen$os op'ionais. 5 primeiro ar.umen$o K um li$eral Aue denomina o nome da 'lasse do ob8e$o a ser re$ornadoZ o padro K Qs$d&lassQ. 5 se.undo ar.umen$o K um ve$or de valores Aue sero passados para o 'ons$ru$or daAuela 'lasse. Exemplo 10.&0. Usando !etc*5b'ect<=

,*E1 *

<?php $st)t $db3#query"'4585.; bu/_id( bu/_description( bu/_status 6<7M bu/s'+; $ob1 $st)t3#-etch7b1ect"+; echo $ob13#bu/_description;

;e8a $ambKm 0"5S$a$emen$PP-e$'95b8e'$().

10.". Zend_Db_(ro!#ler10.".1. Dntrodu./o


Zend_Db_Pro-iler pode ser 9abili$ado para permi$ir o per-ilar de 'onsul$as. 0er-is in'luem as 'onsul$as pro'essadas pelo adap$ador assim 'omo o $empo de'orrido para rodar as 'onsul$asM permi$indo a inspe>o das 'onsul$as Aue -oram e3e'u$adas sem pre'usar de 'Ldi.o de depura>o e3$ra para as 'lasses. )so avan>ado $ambKm permi$e ao desenvolvedor -il$rar Auais 'onsul$as sero per-iladas. Iabili$e o pro-iler passando um dire$iva para o 'ons$ru$or do adap$adorM ou pedindo ao adap$ador para 9abili$<lo mais $arde.
<?php require_once 'Zend/Db.php'; $para)s array" 'host' # '$%&.'.'.$'( 'userna)e' # '!ebuser'( 'pass!ord' # '********'( 'dbna)e' # 'test' 'pro-iler' # true // li/a o pro-iler; con-i/ura para -alse para desabilitar "padrFo+ +; $db Zend_Db,,-actory"'PD7_M@4?8'( $para)s+; // desli/a o pro-iler, $db3#/etPro-iler"+3#set5nabled"-alse+; // li/a o pro-iler, $db3#/etPro-iler"+3#set5nabled"true+;

5 valor da op>o Qpro-ilerQ K -le3Cvel. X in$erpre$ado de modo di-eren$e dependendo de seu $ipo. "e modo mais -reAWen$eM vo'O deve usar um valor booleano simplesM mas ou$ros $ipos 9abili$am vo'O a 'us$omizar o 'ompor$amen$o do pro-iler. )m ar.umen$o booleano 'on-i.ura o pro-iler a ser 9abili$ado se seu valor K true valueM o desabili$ado se -alse. # 'lasse pro-iler K a 'lasse pro-iler padro do adap$adorM Zend_Db_Pro-iler.

5 5 $ermo em in.lOs para 'riador de per-is no ser $raduzidoM mas suas varia>4es sim.

,,E1 *

$para)sM'pro-iler'N true; $db Zend_Db,,-actory"'PD7_M@4?8'( $para)s+;

)ma ins$1n'ia de um ob8e$o pro-iler -az o adap$ador usar esse ob8e$o. 5 $ipo de ob8e$o deve ser Zend_Db_Pro-iler ou uma sub'lasse do mesmo. # 9abili$a>o do pro-iler K -ei$a separadamen$e.
$pro-iler MyPro1ect_Db_Pro-iler"+; $pro-iler3#set5nabled"true+; $para)sM'pro-iler'N $pro-iler; $db Zend_Db,,-actory"'PD7_M@4?8'( $para)s+;

5 ar.umen$o pode ser um ve$or asso'ia$ivo 'on$endo AualAuer ou $odas as '9aves QenabledQM QinstanceQM e QclassQ. #s '9aves QenabledQ e QinstanceQ 'orrespondem ao booleano e $ipos de ins$1n'ia do'umen$ados a'ima. # '9ave QclassQ K usada para nomear uma 'lasse a ser usada por um pro-iler 'us$omizado. # 'lasse deve ser Zend_Db_Pro-iler ou uma sub'lasse. # 'lasse K ins$an'iada sem nen9um ar.umen$o de 'ons$ru$or. # op>o QclassQ K i.norada Auando a op>o QinstanceQ K -orne'ida.
$para)sM'pro-iler'N array" 'enabled' # true( 'class' # 'MyPro1ect_Db_Pro-iler' +; $db Zend_Db,,-actory"'PD7_M@4?8'( $para)s+;

Finalmen$eM o ar.umen$o pode ser um ob8e$o do $ipo Zend_.on-i/ 'on$endo propriedadesM Aue so $ra$adas 'omo as '9aves de ve$or des'ri$as a'ima. 0or e3emploM um arAuivo T'on-i..iniU pode 'on$er os se.uin$es dadosP
M)ainN db.pro-iler.class db.pro-iler.enabled

TMyPro1ect_Db_Pro-ilerT true

=ssa 'on-i.ura>o ode ser apli'ada pelo se.uin$e 'Ldi.o 0I0P


$con-i/ ne! Zend_.on-i/_9ni"'con-i/.ini'( ')ain'+; $para)sM'pro-iler'N $con-i/3#db3#pro-iler; $db Zend_Db,,-actory"'PD7_M@4?8'( $para)s+;

# propriedade QinstanceQ pode ser usada 'omo no 'Ldi.o se.uin$eP


$pro-iler ne! MyPro1ect_Db_Pro-iler"+; $pro-iler3#set5nabled"true+; $con-i/Data array" 'instance' # $pro-iler +; $con-i/ ne! Zend_.on-i/"$con-i/Data+; $para)sM'pro-iler'N $con-i/; $db Zend_Db,,-actory"'PD7_M@4?8'( $para)s+;

,%E1 *

10.".2. Usando o (ro!#ler


=m AualAuer pon$oM pe.ue o pro-iler usando o mK$odo /etPro-iler"+ do adap$adorP
<?php $pro-iler

$db3#/etPro-iler"+;

?sso re$orna uma ins$1n'ia de ob8e$o Zend_Db_Pro-iler. &om essa ins$1n'iaM o desenvolvedor pode e3aminar suas 'onsul$as usando uma variedade de mK$odosP

/et;otal2u)?ueries"+ re$orna o nNmero $o$al de 'onsul$as Aue -oram per-iladas. /et;otal5lapsed4ecs"+ re$orna o nNmero $o$al de se.undos $rans'orridos para $odas as 'onsul$as per-iladas. /et?ueryPro-iles"+ re$orna um ve$or de $odos os per-is de 'onsul$a. /et8ast?ueryPro-ile"+ re$orna o Nl$imo (mais re'en$e) per-il de 'onsul$aM no obs$an$e a 'onsul$a $en9a ou no $erminado. (se no $iverM a 9ora de $Krmino ser nula) clear"+ limpa AuaisAuer per-is de 'onsul$a passados da pil9a.

5 valor de re$orno de /et8ast?ueryPro-ile"+ e os elemen$os individuais de /et?ueryPro-iles"+ so ob8e$os Zend_Db_Pro-iler_?ueryM Aue provOem a 9abilidade de inspe'ionar as 'onsul$as individuais por elas mesmasP

/et?uery"+ re$orna o $e3$o SDL da 'onsul$a. 5 $e3$o SDL de uma de'lara>o preparada 'om par1me$ros K o $e3$o no momen$o em Aue a 'onsul$a -or preparadaM assim ela 'on$Km espa>os reservados para valores de par1me$roM no os valores usados Auando a de'lara>o K e3e'u$ada. /et?ueryPara)s"+ re$orna um ve$or de valores de par1me$ro usados Auando e3e'u$ar uma 'onsul$a preparada. ?sso in'lui $an$o par1me$ros de 'ombina>o Auan$o ar.umen$os para o mK$odo e*ecute"+ de de'lara>o. #s '9aves do ve$or so Cndi'es de parma$ro posi'ionais (baseados em 1) ou nomeados (s$rin.). /et5lapsed4ecs"+ re$orna o nNmero de se.undo Aue a 'onsul$a levou para rodar.

# in-orma>o Aue o Zend_Db_Pro-iler provO K N$il para per-ilar .ar.alos em apli'a>4esM e para depurar 'onsul$as Aue $en9am rodado. 0or e3emploM para ver a 'onsul$a e3a$a Aue -oi rodada por Nl$imoP
<?php $query $pro-iler3#/et8ast?ueryPro-ile"+; echo $query3#/et?uery"+;

,5E1 *

Talvez um p.ina se8a .erada mui$o len$amen$eZ use o pro-iler para de$erminar primeiro o nNmero de se.undos $o$al de $odas as 'onsul$asM e en$o 'amin9e a$ravKs das 'onsul$as para en'on$ra a Aue roda por mais $empoP
<?php $total;i)e $pro-iler3#/et;otal5lapsed4ecs"+; $query.ount $pro-iler3#/et;otal2u)?ueries"+; $lon/est;i)e '; $lon/est?uery null; -oreach "$pro-iler3#/et?ueryPro-iles"+ as $query+ C i- "$query3#/et5lapsed4ecs"+ # $lon/est;i)e+ C $lon/est;i)e $query3#/et5lapsed4ecs"+; $lon/est?uery $query3#/et?uery"+; D D echo '5*ecuted ' . $query.ount . ' queries in ' . $total;i)e . ' seconds' . TUnT ; echo 'ABera/e query len/th, ' . $total;i)e / $query.ount . ' seconds' . TUnT; echo '?ueries per second, ' . $query.ount / $total;i)e . TUnT; echo '8on/est query len/th, ' . $lon/est;i)e . TUnT; echo T8on/est query, UnT . $lon/est?uery . TUnT;

10.".". Uso A,an.ado do (ro!#ler


=m adi>o F inspe>o de 'onsul$asM o pro-iler $ambKm permi$e ao desenvolvedor -il$rar Auais 'onsul$as 'onse.uem ser per-iladas. 5s se.uin$es mK$odos operam sobre uma ins$1n'ia de Zend_Db_Pro-ilerP 10.".".1. F#ltro pelo tempo de consulta transcorr#do set6ilter5lapsed4ecs"+ permi$e ao desenvolvedor 'on-i.urar um $empo de 'onsul$a mCnimo an$es Aue uma 'onsul$a se8a per-ilada. 0ara remover o -il$roM passe para o mK$odo um valor nulo.
<?php // 7nly pro-ile queries that taXe at least Z seconds, $pro-iler3#set6ilter5lapsed4ecs"Z+; // Pro-ile all queries re/ardless o- len/th, $pro-iler3#set6ilter5lapsed4ecs"null+;

10.".".2. F#ltro pelo t#po de consulta set6ilter?uery;ype"+ permi$e ao desenvolvedor 'on-i.urar Auais $ipos de 'onsul$a devem ser per-iladasZ para mNl$iplos $ipos de per-isM use o operador booleano 57 en$re eles. Tipos de 'onsul$a so de-inidiso 'omo as se.uin$es 'ons$an$es Zend_Db_Pro-ilerP

Zend_Db_Pro-iler,,.7225.;P opera>4es de 'one3oM ou sele>o de um ban'o de dados. ,/E1 *

Zend_Db_Pro-iler,,?=5<@P 'onsul$as .erais a ban'o de dados Aue no se en'ai3em em ou$ros $ipos. Zend_Db_Pro-iler,,9245<;P AualAuer 'onsul$a Aue adi'ione novos dados ao ban'oM .eralmen$e SDL ?BS=7T. Zend_Db_Pro-iler,,=PDA;5P AualAuer 'onsul$a Aue a$ualize AuaisAuer dados e3is$en$esM normalmen$e SDL )0"#T=. Zend_Db_Pro-iler,,D585;5P AualAuer 'onsul$a Aue apa.ue dados e3is$en$esM .eralmen$e SDL "=L=T=. Zend_Db_Pro-iler,,4585.;P AualAuer 'onsul$a Aue re'upere dados e3is$en$esM .eralmen$e S=L=&T. Zend_Db_Pro-iler,,;<A24A.;972P AualAuer opera>o $ransa'ionalM $al 'omo s$ar$ $ransa'$ionM 'ommi$M ou rollba'k.

#ssim 'omo 'om a'on$e'e 'om set6ilter5lapsed4ecs"+M vo'O pode remover AuaisAuer -il$ros e3is$en$es pela passa.em de null 'omo ar.umen$o solo.
<?php // Per-ila so)ente consultas 4585.; $pro-iler3#set6ilter?uery;ype"Zend_Db_Pro-iler,,4585.;+; // Per-ila consultas 4585.;( 9245<;( e =PDA;5 $pro-iler3#set6ilter?uery;ype"Zend_Db_Pro-iler,,4585.; [ Zend_Db_Pro-ile r,,9245<; [ Zend_Db_Pro-iler,,=PDA;5+; // Per-ila consultas D585;5 "assi) pode)os i)a/inar por que os dados continua) desaparecendo+ $pro-iler3#set6ilter?uery;ype"Zend_Db_Pro-iler,,D585;5+; // <e)oBe todos os -iltros $pro-iler3#set6ilter?uery;ype"null+;

10.".".". :ecuperar per!#s por t#po de consulta )sar set6ilter?uery;ype"+ pode abreviar a .era>o de per-is. =n$re$an$oM al.umas vezesM pode ser mais N$il man$er $odos os per-isM mas ver somen$e aAueles Aue -orem ne'essrios em um dado momen$o. 5u$ra 'ara'$erCs$i'a de /et?ueryPro-iles"+ K Aue ele pode -azer essa -il$ra.em din1mi'aM pela passa.em de um $ipo de 'onsul$a (ou 'ombina>o lL.i'a de $ipos de 'onsul$a) 'omo seu primeiro ar.umen$oZ ve8a Se>o 1 .,.,.*M TFil$ro pelo $ipo de 'onsul$aU para uma lis$a 'omple$a das 'ons$an$es de $ipo de 'onsul$a.
<?php // <ecupera $pro-iles // <ecupera $pro-iles ler,,9245<; // <ecupera

so)ente per-is de consulta 4585.; $pro-iler3#/et?ueryPro-iles"Zend_Db_Pro-iler,,4585.;+; so)ente per-is de consulsta 4585.;( 9245<;( e =PDA;5 $pro-iler3#/et?ueryPro-iles"Zend_Db_Pro-iler,,4585.; [ Zend_Db_Pro-i [ Zend_Db_Pro-iler,,=PDA;5+; per-is de consulta D585;5 "assi) pode)os i)a/inar por que os dados

,2E1 *

continua) desaparecendo+ $pro-iles $pro-iler3#/et?ueryPro-iles"Zend_Db_Pro-iler,,D585;5+;

10.&. Zend_Db_Aelect
10.&.1. :esumo do 5b'eto Aelect
5 ob8e$o Zend!"b!Sele'$ represen$a uma de'lara>o de 'onsul$a SDL 4585.;. # 'lasse $em mK$odos para adi'ionar par$es individuais F 'onsul$a. ;o'O pode espe'i-i'ar al.umas par$es da 'onsul$a usando mK$odos 0I0 e es$ru$uras de dadosM e a 'lasse -orma a sin$a3e SDL 'orre$a para vo'O. "epois de 'ons$ruir a 'onsul$aM vo'O opode e3e'u$<la 'omo se vo'O a $ivesse es'ri$o 'omo um li$eral. 5 valor o-ere'ido por Zend!"b!Sele'$ in'luiP

:K$odos orien$ados a ob8e$o para espe'i-i'ar 'onsul$as SDL de uma -orma passo<a<passoZ #bs$ra>o independen$e de ban'o de dados de al.umas par$es da 'onsul$a SDLZ &i$a>o au$om$i'a de iden$i-i'adores de me$adados ('om apLs$ro-os na maioria dos 'asos)M para supor$ar iden$i-i'adores 'on$endo palavras reservadas SDL e 'ara'$eres espe'iaisZ &i$a>o de iden$i-i'adores e valoresM para a8udar a reduzir o ris'o de a$aAues de SDL in8e'$ion.

)sar Zend!"b!Sele'$ no K obri.a$Lrio. 0ara 'onsul$as S=L=&T mui$o simplesM K .eralmen$e mais simples espe'i-i'ar a 'onsul$a SDL in$eira 'omo um li$eral e e3e'u$<la usando mK$odos do adap$ador 'omo query"+ ou -etchAll"+. )sar Zend!"b!Sele'$ K N$il se vo'O pre'isar mon$ar uma 'onsul$a S=L=&T pro'eduralmen$e M ou baseado em 'ondi>4es lL.i'as em sua apli'a>o.

10.&.2. Cr#ando um 5b'eto Aelect


;o'O pode 'riar uma ins$1n'ia de um ob8e$o Zend!"b!Sele'$ usando o mK$odo select"+ de um ob8e$o Zend!"b!#dap$er!#bs$ra'$. Exemplo 10.&1. Exemplo de um m todo select<= de um adaptador de banco de dados
<?php $db Zend_Db,,-actory" ...options... +; $select $db3#select"+;

5u$ro modo de 'riar um ob8e$o Zend!"b!Sele'$ K 'om seu 'ons$ru$orM espe'i-i'ando o adap$ador do ban'o de dados 'omo um ar.umen$o. ,@E1 *

Exemplo 10.&2. Exemplo de cr#a./o de um no,o ob'eto Aelect


<?php $db Zend_Db,,-actory" ...options... +; $select ne! Zend_Db_4elect"$db+;

10.&.". Constru#ndo consultas Aelect


Duando 'ons$ruir a 'onsul$aM vo'O pode adi'ionar 'lusulas da 'onsul$aM uma a uma. I um mK$odo separado para 'ada 'lusula do ob8e$o Zend!"b!Sele'$. Exemplo 10.&". Exemplo de uso de m todos para ad#c#onar clMusulas
<?php // .ria o ob1eto Zend_Db_4elect $select $db3#select"+; // Adiciona u)a cl\usula 6<7M $select3#-ro)" ...speci-y table and colu)ns... + // Adiciona u)a cl\usula >H5<5 $select3#!here" ...speci-y search criteria... + // Adicione u)a cl\usula 7<D5< A@ $select3#order" ...speci-y sortin/ criteria... +;

;o'O $ambKm pode usar a maioria dos mK$odos do ob8e$o Zend!"b!Sele'$ 'om uma in$er-a'e -luen$e 'onvenien$e. )ma in$er-a'e -luen$e si.ni-i'a Aue 'ada mK$odo re$orna uma re-erOn'ia para o ob8e$o sobre o Aual -oi '9amadoM assim vo'O pode imedia$amen$e '9mara ou$ro mK$odo. Exemplo 10.&&. Exemplo de uso da #nter!ace !luente
<?php $select $db3#select"+ 3#-ro)" ...especi-ique tabela e colunas... + 3#!here" ...especi-ique critLio de busca... + 3#order" ...especi-ique critLrio de ordenaYFo... +;

5s e3emplos nes$a se>o mos$ram o uso da in$er-a'e -luen$eM mas vo'O pode usar a in$re-a'e no< -luen$e em $odos os 'asos. X -reAWen$emen$e ne'essrio usara in$er-a'e no<-luen$eM por e3emploM se sua apli'a>o pre'isa e3e'u$ar al.uma lL.i'a an$es de adi'ionar uma 'lusula F 'onsul$a.

,6E1 *

10.&.".1. Ad#c#onando uma clMusula F:58 =spe'i-iAue a $abela para essa 'onsul$a usando o mK$odo -ro)"+. ;o'O pode espe'i-i'ar o nome da $abela 'omo um li$eral simples. Zend!"b!Sele'$ apli'a iden$i-i'a>o por 'i$a>o no nome da $abelaM assim vo'O pode usar 'ara'$eres espe'iais. Exemplo 10.&-. Exemplo do m todo !rom<=
<?php // .onstrWi esta consulta, // 4585.; J // 6<7M TproductsT $select $db3#select"+ 3#-ro)" 'products' +;

;o'O pode $ambKm espe'i-i'ar o nome de 'orrela>o (al.umas vezes '9amado de Tapelido da $abelaU) para uma $abela. #o invKs de um li$eral simplesM use um ve$or asso'ia$ivo para mapear o nome de 'orrela>o 'om o nome da $abela. =m ou$ras 'lusulas da 'onsul$a SDLM use o nome de 'orrela>o. Se sua 'onsul$a a.rupa mais de uma $abelaM Zend!"b!Sele'$ .era nomes de 'orrela>o Nni'os baseados nos nomes da $abelasM para $odas as $abelas 'u8os nomes de 'orrela>o no -orem espe'i-i'ados. Exemplo 10.&1. Exemplo de espec#!#ca./o de um nome de correla./o de tabela
<?php // .onstrWi esta consulta, // 4585.; p.J // 6<7M TproductsT A4 p $select $db3#select"+ 3#-ro)" array"'p' # 'products'+ +;

#l.umas mar'as de 7"(:S supor$am um espe'i-i'ador de esAuema lCder para uma $abela. ;o'O pode espe'i-i'ar o nome da $abela 'omo Rsche)a2a)e.table2a)eRM onde Zend!"b!Sele'$ delimi$a 'om apLs$ro-os 'ada par$e individualmen$eM ou vo'O pode espe'i-i'ar o nome do esAuema separadamen$e. )m nome de esAuema espe'i-i'ado no nome da $abela $em pre'edOn'ia sobre um esAuema -orne'ido separadamen$e no even$o em Aue ambos so -orne'idos. Exemplo 10.&3. Exemplo de espec#!#ca./o de um nome de es2uema
<?php // .onstrWi esta consulta, // 4585.; J // 6<7M T)ysche)aT.TproductsT $select $db3#select"+ 3#-ro)" ')ysche)a.products' +;

% E1 *

// or $select $db3#select"+ 3#-ro)"'products'( 'J'( ')ysche)a'+;

10.&.".2. Ad#c#onando Colunas Bo se.undo ar.umen$o do mK$odo -ro)"+M ;o'O pode espe'i-i'ar as 'olunas a serem sele'ionadas da respe'$iva $abela. Se vo'O no espe'i-i'ar 'oluna al.umaM o padro K RJRM o 'urin.a SDL para T$odas as 'olunasU. ;o'O pode lis$ar as 'olunas em um simples ve$or de li$eraisM ou 'omo um mapeamen$o asso'ia$ivo de nomes de 'oluna. Se vo'O $em somen$e uma 'oluna para 'onsul$arM e vo'O no pre'isa espe'i-i'ar um apelido de 'olunaM vo'O pode lis$<la 'omo um li$eral puro ao invKs de um ve$or. Se vo'O d um ve$or vazio 'omo ar.umen$o de 'olunasM nen9uma 'oluna da respe'$iva $abela ser in'luCda no 'on8un$o de resul$ado. ;e8a um e3emplo de 'Ldi.o rela'ionado na se>o sobre o mK$odo 1oin"+. ;o'O pode espe'i-i'ar o nome da 'oluna 'omo Rcorrelation2a)e.colu)n2a)eR. Zend!"b!Sele'$ 'er'a 'ada par$e 'om apLs$ro-os individualmen$e. Se vo'O no espe'i-i'ar um nome de 'orrela>o para uma 'olunaM ele usar o nome de 'orrela>o para a $abela nomeado no mK$odo -ro)"+ a$ual. Exemplo 10.&7. Exemplos de espec#!#ca./o de colunas
<?php // .onstrWi esta consulta, // 4585.; p.Tproduct_idT( p.Tproduct_na)eT // 6<7M TproductsT A4 p $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'( 'product_na)e'++; // .onstrWi a )es)a consulta( especi-icando os no)es de correlaYFo, // 4585.; p.Tproduct_idT( p.Tproduct_na)eT // 6<7M TproductsT A4 p $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'p.product_id'( 'p.product_na)e'++; // .onstrWi esta consulta co) u) apelido para u)a coluna, // 4585.; p.Tproduct_idT A4 prodno( p.Tproduct_na)eT // 6<7M TproductsT A4 p $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'prodno' # 'product_id'( 'product_na)e'++;

%1E1 *

10.&.".". Ad#c#onando Colunas de Express/o &olunas em 'onsul$as SDL so al.umas vezes e3press4esM no simplesmen$e nomes de 'olunas de uma $abela. =3press4es no devem $er nomes de 'orrela>o ou apLs$ro-os apli'ados. Se seu li$eral de 'oluna 'on$Km parOn$esesM Zend!"b!Sele'$ re'on9e'e<o 'omo uma e3presso. ;o'O $ambKm pode 'riar um ob8e$o do $ipo Zend!"b!=3pr e3pli'i$amen$eM para prevenir um li$eral de ser $ra$ado 'omo um nome de 'oluna. Zend!"b!=3pr K uma 'lasse mCnima Aue 'on$Km um li$eral simples. Zend!"b!Sele'$ re'on9e'e ob8e$os do $ipo Zend!"b!=3pr e 'onver$e<os de vol$a para li$eraisM mas no apli'a AualAuer al$era>4esM $ais 'omo inser>o de apLs$ro-os ou nomes de 'orrela>o. Nota )sar Zend!"b!=3pr para nomes de 'oluna no K ne'essrio se sua e3presso de 'oluna 'on$iver parOn$esesZ Zend!"b!Sele'$ re'on9e'e parOn$eses e $ra$a o li$eral 'omo uma e3pressoM pulando a inser>o de parOn$eses e nomes de 'orrela>o. Exemplo 10.&;. Exemplos de espec#!#ca./o de colunas contendo express4es
<?php // .onstrWi esta consulta, // 4585.; p.Tproduct_idT( 87>5<"product_na)e+ // 6<7M TproductsT A4 p // =)a e*pressFo co) parRnteses i)plicita)ente torna3se // u)a Zend_Db_5*pr. $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'( '87>5<"product_na)e+'++; // .onstrWi esta consulta, // 4585.; p.Tproduct_idT( "p.cost J $.']+ A4 cost_plus_ta* // 6<7M TproductsT A4 p $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'( 'cost_plus_ta*' # '"p.cost J $.']+'++; // .onstrWi esta consulta usando Zend_Db_5*pr e*plicita)ente, // 4585.; p.Tproduct_idT( p.cost J $.'] A4 cost_plus_ta* // 6<7M TproductsT A4 p $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'( 'cost_plus_ta*' # ne! Zend_Db_5*pr"'p.cost J $.']'+ ++;

Bos 'asos a'imaM Zend!"b!Sele'$ no al$era o li$eral para apli'ar nomes de 'orrela>o ou apLs$ro-os iden$i-i'adores. Se essas mudan>as -orem ne'essrias para resolver ambi.WidadeM vo'O deve -azer as mudan>as manualmen$e no li$eral. Se seus nomes de 'oluna so palavras<'9ave SDL ou 'on$Om 'ara'$eres espe'iaisM vo'O deve usar o mK$odo de adap$ador quote9denti-ier"+ e in$erpolar o resul$ado den$ro de um li$eral. 5 mK$odo quote9denti-ier"+ usa apLs$ro-os SDL para delimi$ar o iden$i-i'adorM o Aue $orna 'laro Aue ele K um iden$i-i'ador para uma $abela ou uma 'olunaM e no AualAuer ou$ra par$e da %*E1 *

sin$a3e SDL. Seu 'Ldi.o -i'a mais independen$e da base de dados se vo'O usar o mK$odo quote9denti-ier"+ ao invKs de di.i$ar apLs$ro-os li$eralmen$e em seu li$eralM porAue al.umas mar'as de 7"(:S usam sCmbolos no padronizados para iden$i-i'adores de apLs$ro-o. 5 mK$odo quote9denti-ier"+ K pro8e$ado para usar os sCmbolos de apLs$ro-os apropriados baseados no $ipo de adap$ador. 5 mK$odo quote9denti-ier"+ $ambKm anula os e-ei$os de AuaisAuer 'ara'$eres de 'i$a>o Aue apare>am den$ro do prLprio nome do iden$i-i'ador. Exemplo 10.-0. Exemplos de colunas c#tadas em uma express/o
<?php // .onstrWi esta consultaq( citando u) no)e de coluna especial ^-ro)_ na e*pressFo, // 4585.; p.T-ro)T ` $' A4 ori/in // 6<7M TproductsT A4 p $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'ori/in' # '"p.' . $db3#quote9denti-ier"'-ro)'+ . ' ` $'+'++;

10.&.".&. Ad#c#onando 5utra ?abela N Consulta com B5DN :ui$as 'onsul$as N$eis envolvem o uso de K792 para 'ombinar lin9as de mNl$iplas $abelas. ;o'O pode adi'ionar $abelas a uma 'onsul$a Zend!"b!Sele'$ usando o mK$odo 1oin"+. )sar esse mK$odo K similar ao mK$odo -ro)"+M e3'e$o pelo -a$o de Aue vo'O pode espe'i-i'ar $ambKm uma 'ondi>o de 8un>o na maioria dos 'asos. Exemplo 10.-1. Exemplo do m todo 'o#n<=
<?php // .onstrWi essa consulta, // 4585.; p.Tproduct_idT( p.Tproduct_na)eT( l.J // 6<7M TproductsT A4 p K792 Tline_ite)sT A4 l // 72 p.product_id l.product_id $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'( 'product_na)e'++ 3#1oin"array"'l' # 'line_ite)s'+( 'p.product_id l.product_id'+;

5 se.undo ar.umen$o para 1oin"+ K um li$eral Aue represen$a a 'ondi>o de 8un>o. =ssa K uma e3presso Aue de'lara os 'ri$Krios pelos Auais lin9as em uma $abela 'asaro 'om a ou$ra $abela. ;o'O pode usar nomes de 'orrela>o nessa e3presso.

%,E1 *

Nota &i$a>o no K apli'ada F e3presso Aue vo'O espe'i-i'a para a 'ondi>o de 8oinZ se vo'O $em nomes de 'oluna Aue pre'isam ser 'i$adosM vo'O deve usar quote9denti-ier"+ para -orma$ar o li$eral para a 'ondi>o de 8un>o. 5 $er'eiro ar.umen$o para 1oin"+ K um ve$or de nomes de 'olunaM 'omo o usado no mK$odo -ro)"+. 5 padro K RJRM supor$a nomes de 'orrela>oM e3press4esM e Zend!"b!=3pr do mesmo modo Aue o ve$or de nomes de 'olunas no mK$odo -ro)"+. 0ara no sele'ionar 'oluna al.uma de uma $abelaM use um ve$or vazio para a lis$a de 'olunas. =sse uso -un'iona no mK$odo -ro)"+ $ambKmM mas $ipi'amen$e vo'O ir Auerer 'olunas da $abela primria em suas 'onsul$asM desde Aue vo'O no dese8e 'oluna al.uma de uma $abela 'ombinada. Exemplo 10.-2. Exemplo de n/o espec#!#ca./o de colunas
<?php // .onstrWi essa consulta, // 4585.; p.Tproduct_idT( p.Tproduct_na)eT // 6<7M TproductsT A4 p K792 Tline_ite)sT A4 l // 72 p.product_id l.product_id $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'( 'product_na)e'++ 3#1oin"array"'l' # 'line_ite)s'+( 'p.product_id l.product_id'( array"+ +; // e)pty list o- colu)ns

Bo$e o array"+ vazio no e3emplo a'ima no lu.ar de uma lis$a de 'olunas de uma $abela 'ombinada.

SDL $em diversos $ipos de 8un>4es. ;e8a a lis$a abai3o para os mK$odos Aue supor$am di-eren$es $ipos de 8un>o em Zend!"b!Sele'$.

DNNE: B5DN 'om os mK$odos 1oin"table( 1oin9nner"table( 1oin( Mcolu)nsN+.

1oin(

Mcolu)nsN+

oo

=sse pode ser o $ipo de 8un>o mais 'omum. Lin9as de 'ada $abela so 'omparadas usando a 'ondi>o de 8un>o Aue vo'O espe'i-i'ar. 5 5b8e$o 7owse$ in'lui somen$e as lin9as Aue sa$is-azem a 'ondi>o de 8un>o. 5 5b8e$o 7owse$ pode ser vazio se nen9uma lin9a sa$is-az essa 'ondi>o. Todas as mar'as de 7"(:S supor$am esse $ipo de 8un>o.

9EF? B5DN 'om o mK$odo 1oin8e-t"table( condition( Mcolu)nsN+. Todas as lin9as da $abela F esAuerda do operando so in'luCdasM 'asando 'om lin9as da $abela F direi$a do operandoM e as 'olunas da $abela F direi$a do operando so preen'9idas %%E1 *

'om B)LLs se no 9ouver 'asamen$o 'om a $abela da esAuerda. Todas as mar'as de 7"(:S supor$am esse $ipo de 8un>o.

:D6@? B5DN 'om o mK$odo 1oin<i/ht"table( condition( Mcolu)nsN+. 7i.9$ ou$er 8oin K o 'omplemen$o de le-$ ou$er 8oin. Todas as lin9as da $abela F direi$a do operando so in'luCdasM 'asando 'om lin9as da $abela F esAuerda do operandoM e as 'olunas da $abela F esAuerda do operando so preen'9idas 'om B)LLs se no 9ouver 'asamen$o 'om a $abela da direi$a. #l.umas mar'as de 7"(:S no supor$am esse $ipo de 8un>oM mas em .eral AualAuer ri.9$ 8oin pode ser represen$ado 'omo um le-$ 8oin pela reverso da ordem das $abelas.

FU99 B5DN 'om o mK$odo 1oin6ull"table( condition( Mcolu)nsN+. )ma -ull ou$er 8oin K 'omo uma 'ombina>o de uma le-$ ou$er 8oin e uma ri.9$ ou$er 8oin. Todas as lin9as de ambas as $abelas so in'luCdasM emparel9adas umas 'om as ou$roas na mesma lin9a do 5b8e$o 7owse$ se elas sa$is-izerem a 'ondi>o de 8un>oM e 'aso 'on$rrio emparel9ados 'om B)LLs no lu.ar de 'olunas da ou$ra $abela. #l.umas mar'as de 7"(:S no supor$am esse $ipo de 8un>o.

C:5AA B5DN 'om o mK$odo 1oin.ross"table( Mcolu)nsN+. )ma 'ross 8oin K um produ$o &ar$esiano. &ada lin9a na primeira $abela K 'asada 'om 'ada lin9a na se.unda $abela. 0or$an$o o nNmero de lin9as no 5b8e$o 7owse$ K i.ual ao produ$o do nNmero de lin9as em 'ada $abela. ;o'O pode -il$rar o 5b8e$o 7owse$ usando 'ondi>4es em uma 'lusula HI=7=Z desse modo uma 'ross 8oin K similar a vel9a sin$a3e 8oin SDL< @6. 5 mK$odo 1oin.ross"+ no $em par1me$ro para espe'i-i'ar a 'ondi>o de 8un>o. #l.umas mar'as de ban'os de dados no supor$am esse $ipo de 8un>o.

NA?U:A9 B5DN 'om o mK$odo 1oin2atural"table( Mcolu)nsN+. )ma na$ural 8oin 'ompara AualAuer 'oluna(s) Aue apare>a 'om o mesmo nome em ambas as $abelas. # 'ompara>o K a i.ualdade de $odas as 'olunasZ 'omparar as 'olunas usando desi.ualdade no K uma na$ural 8oin. Somen$e na$ural inner 8oins so supor$adas por es$a #0?M embora SDL permi$a na$ural ou$er 8oins de AualAuer -orma. 5 mK$odo 1oin2atural"+ no $em par1me$ros para espe'i-i'ar a 'ondi>o de 8un>o.

=m adi>o a esses mK$odos de 8un>oM vo'O pode simpli-i'ar suas 'onsul$as pelo uso de mK$odos Goin)sin.. #o invKs de -orne'er uma 'ondi>o 'omple$a para sua 8un>oM vo'O simplesmen$e passa o nome da 'oluna sobre a Aual se dar a 8un>o e o ob8e$o Zend!"b!Sele'$ 'omple$a a 'ondi>o para vo'O. Exemplo 10.-". Exemplo do uso do m todo 'o#nUs#n%<= %5E1 *

<?php // .onstrWi esta consulta, // 4585.; J // 6<7M Ttable$T // K792 Ttable%T // 72 Ttable$T.colu)n$ Ttable%T.colu)n$ // >H5<5 colu)n% '-oo' $select $db3#select"+ 3#-ro)"'table$'+ 3#1oin=sin/"'table%'( 'colu)n$'+ 3#!here"'colu)n% ?'( '-oo'+;

&ada um dos mK$odos de 8un>o apli'veis no 'omponen$e Zend!"b!Sele'$ $em um mK$odo Qusin.Q 'orresponden$e.

1oin=sin/"table( 1oin( Mcolu)nsN+ e 1oin9nner=sin/"table( 1oin( Mcolu)nsN+ 1oin8e-t=sin/"table( 1oin( Mcolu)nsN+ 1oin<i/ht=sin/"table( 1oin( Mcolu)nsN+ 1oin6ull=sin/"table( 1oin( Mcolu)nsN+

10.&.".-. Ad#c#onando uma ClMusula O@E:E ;o'O pode espe'i-i'ar 'ri$Krios para res$rin.ir lin9as do 5b8e$o 7owse$ usando o mK$odo !here"+. 5 primeiro ar.umen$o desse mK$odo K uma e3presso SDLM e essa e3presso K u$ilizada em uma 'lusula SDL >H5<5 na 'onsul$a. Exemplo 10.-&. Exemplo do m todo +*ere<=
<?php // .onstrWi essa consulta, // 4585.; product_id( product_na)e( price // 6<7M TproductsT // >H5<5 price # $''.'' $select $db3#select"+ 3#-ro)" 'products'( array"'product_id'( 'product_na)e'( 'price'++ 3#!here"'price # $''.'''+;

Nota Ben9uma 'i$a>o K apli'ada para e3press4es dadas aos mK$odos !here"+ ou or>here"+. Se vo'O no $iver nomes de 'olunas Aue pre'isam ser 'i$adosM vo'O deve usar %/E1 *

quote9denti-ier"+ para -ormar o li$eral para a 'ondi>o. 5 se.undo ar.umen$o para o mK$odo !here"+ K op'ional. X um valor para subs$i$uir na e3presso. Zend!"b!Sele'$ 'i$a o valor e subs$i$ui<o por um sCmbolo de in$erro.a>o (R ?R) na e3presso. =sse mK$odo a'ei$a somen$e um par1me$ro. Se vo'O $iver uma e3presso na Aual pre'ise subs$i$uir mNl$iplas variveisM vo'O deve -orma$ar o li$eral manualmen$eM in$erpolando variveis e e3e'u$ar a 'i$a>o por 'on$a prLpria. Exemplo 10.--. Exemplo de um par)metro no m todo +*ere<=
<?php // .onstrWi esta consulta, // 4585.; product_id( product_na)e( price // 6<7M TproductsT // >H5<5 "price # $''.''+ $)ini)u)Price $''; $select $db3#select"+ 3#-ro)" 'products'( array"'product_id'( 'product_na)e'( 'price'++ 3#!here"'price # ?'( $)ini)u)Price+;

;o'O pode invo'ar o mK$odo !here"+ mNl$iplas vezes sobre o mesmo ob8e$o Zend!"b!Sele'$. # 'onsul$a resul$an$e 'ombina os mNl$iplos $ermos 8un$o usando A2D en$re eles. Exemplo 10.-1. Exemplo de mPlt#plos m todos +*ere<=
<?php // .onstrWi esta consulta, // 4585.; product_id( product_na)e( price // 6<7M TproductsT // >H5<5 "price # $''.''+ // A2D "price < Z''.''+ $)ini)u)Price $''; $)a*i)u)Price Z''; $select $db3#select"+ 3#-ro)"'products'( array"'product_id'( 'product_na)e'( 'price'++ 3#!here"'price # ?'( $)ini)u)Price+ 3#!here"'price < ?'( $)a*i)u)Price+;

Se vo'O pre'isar 'ombinar $ermos 8un$os usando 7<M use o mK$odo or>here"+. =sse mK$odo K usado do mesmo modo Aue o mK$odo !here"+M e3'e$o Aue o $ermo espe'i-i'ado K pre'edido por 7<M ao invKs de A2D. %2E1 *

Exemplo 10.-3. Exemplo do m todo orO*ere<=


<?php // .onstrWi esta consulta, // 4585.; product_id( product_na)e( price // 6<7M TproductsT // >H5<5 "price < $''.''+ // 7< "price # Z''.''+ $)ini)u)Price $''; $)a*i)u)Price Z''; $select $db3#select"+ 3#-ro)"'products'( array"'product_id'( 'product_na)e'( 'price'++ 3#!here"'price < ?'( $)ini)u)Price+ 3#or>here"'price # ?'( $)a*i)u)Price+;

Zend!"b!Sele'$ au$oma$i'amen$e 'olo'a parOn$ereses ao redor de 'ada e3presso Aue vo'O espe'i-i'ar usando os mK$odos !here"+ ou or>here"+. ?sso a8uda a .aran$ir Aue a pre'edOn'ia do operador booleano no provoAue resul$ados inesperados. Exemplo 10.-7. Exemplo de #nser./o de parFnteses em express4es booleanas
<?php // .onstrWi esta consulta, // 4585.; product_id( product_na)e( price // 6<7M TproductsT // >H5<5 "price < $''.'' 7< price # Z''.''+ // A2D "product_na)e 'Apple'+ $)ini)u)Price $''; $)a*i)u)Price Z''; $prod 'Apple'; $select $db3#select"+ 3#-ro)"'products'( array"'product_id'( 'product_na)e'( 'price'++ 3#!here"Tprice < $)ini)u)Price 7< price # $)a*i)u)PriceT+ 3#!here"'product_na)e ?'( $prod+;

Bo e3emplo a'imaM os resul$ados deveriam ser 'omple$amen$e di-eren$es sem os parOn$esesM porAue A2D $em pre'edOn'ia mais al$a Aue 7<. Zend!"b!Sele'$ apli'a os parOn$eses de modo Aue o e-ei$o se8a Aue 'ada e3presso em '9amadas su'essivas a !here"+ se -e'9e mais ri.idamen$e do Aue o A2D Aue 'ombina as e3press4es.

%@E1 *

10.&.".1. Ad#c#onando uma clMusula 6:5U( BQ =m SDLM a 'lusula :<7=P A@ permi$e Aue vo'O reduza as lin9as de um 5b8e$o 7owse$ de uma 'onsul$a para uma lin9a por valor Nni'o en'on$rado na(s) 'oluna(s) nomeada(s) na 'lusula :<7=P A@. =m Zend!"b!Sele'$M vo'O pode espe'i-i'ar a(s) 'oluna(s) a serem usadas para 'al'ular os .rupos de lin9as usando o mK$odo /roup"+. 5 ar.umen$o para esse mK$odo K uma 'oluna ou um ve$or de 'olunas a serem u$ilizados na 'lusula :<7=P A@. Exemplo 10.-;. Exemplo do m todo %roup<=
<?php // .onstrWi esta consulta, // 4585.; p.Tproduct_idT( .7=2;"J+ A4 line_ite)s_per_product // 6<7M TproductsT A4 p K792 Tline_ite)sT A4 l // 72 p.product_id l.product_id // :<7=P A@ p.product_id $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'++ 3#1oin"array"'l' # 'line_ite)s'+( 'p.product_id l.product_id'( array"'line_ite)s_per_product' # '.7=2;"J+'++ 3#/roup"'p.product_id'+;

&omo o ve$or de 'olunas no mK$odo -ro)"+M vo'O pode usar nomes de 'orrela>o nos li$erais de nomes de 'olunasM e a 'oluna K 'i$ada 'omo um iden$i-i'ador a menos Aue o li$eral 'on$en9a parOn$eses ou se8a um ob8e$o do $ipo Zend!"b!=3pr. 10.&.".3. Ad#c#onando uma ClMusula @ACDN6 =m SDLM a 'lusula HAG92: apli'a uma 'ondi>o de res$ri>o sobre um .rupo de lin9as. ?sso K similar a 'omo a 'lusula >H5<5 apli'a uma 'ondi>o de res$ri>o sobre as lin9as. :as as duas 'lusulas so di-eren$es porAue as 'ondi>4es >H5<5 so apli'adas an$es Aue os .rupos se8am de-inidosM 8 Aue as 'ondi>4es HAG92: so apli'adas depois Aue os .rupos so de-inidos. =m Zend!"b!Sele'$M vo'O pode espe'i-i'ar 'ondi>4es para res$rin.ir .rupos usando o mK$odo haBin/"+. Seu uso K similar ao do mK$odo !here"+. 5 primeiro ar.umen$o K um li$eral 'on$endo uma e3presso SDL. 5 se.undo ar.umen$o op'ional K um valor Aue K usado para subs$i$uir um espa>o reservado para par1me$ro posi'ional na e3presso SDL. =3press4es dadas em mNl$iplas invo'a>4es do mK$odo haBin/"+ so 'ombinadas usando o operador booleano A2D M ou o operador 7< se vo'O usar o mK$odo orHaBin/"+. Exemplo 10.10. Exemplo do m todo *a,#n%<=

%6E1 *

<?php // .onstrWi esta consulta, // 4585.; p.Tproduct_idT( .7=2;"J+ A4 line_ite)s_per_product // 6<7M TproductsT A4 p K792 Tline_ite)sT A4 l // 72 p.product_id l.product_id // :<7=P A@ p.product_id // HAG92: line_ite)s_per_product # $' $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'++ 3#1oin"array"'l' # 'line_ite)s'+( 'p.product_id l.product_id'( array"'line_ite)s_per_product' # '.7=2;"J+'++ 3#/roup"'p.product_id'+ 3#haBin/"'line_ite)s_per_product # $''+;

Nota Ben9uma 'i$a>o K apli'ada para e3press4es dadas aos mK$odos haBin/"+ ou orHaBin/"+. Se vo'O $iver nomes de 'olunas Aue pre'isam ser 'i$adosM vo'O deve usar quote9denti-ier"+ para -orma$ar o li$eral para a 'ondi>o. 10.&.".7. Ad#c#onando uma ClMusula 5:DE: BQ =m SDLM a 'lusula 7<D5< A@ espe'i-i'a uma ou mais 'olunas ou e3press4es pelas Auais o 5b8e$o 7owse$ de uma 'onsul$a K ordenado. Se mNl$iplas 'olunas so lis$adasM as 'olunas se'undrias so usadas para resolver 'amadasZ a ordem de 'lassi-i'a>o K de$erminada pelas 'olunas se'undrias se as 'olunas pre'eden$es 'on$iverem valores idOn$i'os. # 'lassi-i'a>o padro K do menor valor para o maior. ;o'O pode $ambKm 'lassi-i'ar pelo maior valor ao menos para uma dada 'oluna na lis$a pela espe'i-i'a>o da palavra<'9ave D54. depois da 'oluna. =m Zend!"b!Sele'$M vo'O pode usar o mK$odo order"+ para espe'i-i'ar uma 'oluna ou ve$or de 'olunas pelas Auais 'lassi-i'ar. &ada elemen$o de um ve$or K um li$eral nomeando uma 'olunaM op'ionalmen$e 'om a palavra<'9ave A4. D54. se.uindo<oM separada por um espa>o. &omo nos mK$odos -ro)"+ e /roup"+M nomes de 'oluna so 'i$ados 'omo iden$i-i'adoresM a menos Aue eles 'on$en9am parOn$eses ou se8am ob8e$os do $ipo Zend!"b!=3pr. Exemple 10.11. Exemplo do m todo order<=
<?php // .onstrWi esta consulta, // 4585.; p.Tproduct_idT( .7=2;"J+ A4 line_ite)s_per_product // 6<7M TproductsT A4 p K792 Tline_ite)sT A4 l // 72 p.product_id l.product_id // :<7=P A@ p.product_id // 7<D5< A@ Tline_ite)s_per_productT D54.( Tproduct_idT $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'++ 3#1oin"array"'l' # 'line_ite)s'+(

5 E1 *

'p.product_id l.product_id'( array"'line_ite)s_per_product' # '.7=2;"J+'++ 3#/roup"'p.product_id'+ 3#order"array"'line_ite)s_per_product D54.'( 'product_id'++;

10.&.".;. Ad#c#onando uma ClMsula 9D8D? #l.umas mar'as de 7"(:S es$endem SDL 'om uma 'lusula de 'onsul$a 'on9e'ida 'omo 'lusula 89M9;. =ssa 'lusula reduz o nNmero de lin9as no 5b8e$o 7owse$ para um nNmero Aue vo'O espe'i-i'ar. ;o'O pode $ambKm espe'i-i'ar um sal$o no nNmero de lin9as an$es de ini'iar a saCda. =ssa 'ara'$erCs$i'a $orna -'il $omar um sub'on8un$o de um 5b8e$o 7owse$M por e3emplo Auando e3ibir resul$ados de 'onsul$as em p.inas pro.ressivas da saCda. =m Zend!"b!Sele'$M vo'O pode usar o mK$odo li)it"+ para espe'i-i'ar a 'on$a.em de lin9as e o nNmero de lin9as a sal$ar. 5 primeiro ar.umen$o para esse mK$odo K a 'on$a.em dese8ada de lin9as. 5 se.undo ar.umen$o K o nNmero de lin9as a sal$ar. Exemplo 10.12. Exemplo do m todo l#m#t<=
<?php // .onstrWi esta consulta, // 4585.; p.Tproduct_idT( p.Tproduct_na)eT // 6<7M TproductsT A4 p // 89M9; $'( %' $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'( 'product_na)e'++ 3#li)it"$'( %'+;

Nota # sin$a3e 89M9; no K supor$ada por $odas as mar'as de 7"(:S. #l.uns 7"(:S reAuerem sin$a3es di-eren$es para supor$ar -un'ionalidade similar. &ada 'lasse Zend!"b!#dap$er!#bs$ra'$ in'lui um mK$odo para produzir SDL apropriada para aAuele 7"(:S. )se o mK$odo li)itPa/e"+ para um modo al$erna$ivo de espe'i-i'ar 'on$a.em de lin9as e se.men$o. =sse mK$odo permi$e Aue vo'O limi$e o 5b8e$o 7owse$ para um de uma sKrie de sub'on8un$os de lin9as de 'omprimen$o -i3o ori.inrios do 5b8e$o 7owse$ $o$al da 'onsul$a. =m ou$ras palavrasM vo'O espe'i-i'a o 'omprimen$o de uma Tp.inaU de resul$adosM e o nNmero ordinal da p.ina simples de resul$ados Aue vo'O dese8a Aue 'onsul$a re$orne. 5 nNmero da p.ina K o primeiro ar.umen$o do mK$odo li)itPa/e"+M e o 'omprimen$o da p.ina K o se.undo ar.umen$o. #mbos os ar.umen$os so reAueridosZ eles no $em valores padro. Exemplo 10.1". Exemplo do m todo l#m#t(a%e<=

51E1 *

<?php // .onstrWi esta consulta, // 4585.; p.Tproduct_idT( p.Tproduct_na)eT // 6<7M TproductsT A4 p // 89M9; $'( %' $select $db3#select"+ 3#-ro)"array"'p' # 'products'+( array"'product_id'( 'product_na)e'++ 3#li)itPa/e"%( $'+;

10.&.".10. Ad#c#onando o 8od#!#cador de Consulta DDA?DNC? 5 mK$odo distinct"+ 9abili$a vo'O a adi'ionar a palavra<'9ave D94;92.; F sua 'onsul$a SDL. Exemplo 10.1&. Exemplo do m todo d#st#nct<=
<?php // .onstrWi esta consulta, // 4585.; D94;92.; p.Tproduct_na)eT // 6<7M TproductsT A4 p $select $db3#select"+ 3#distinct"+ 3#-ro)"array"'p' # 'products'+( 'product_na)e'+;

10.&.".11. Ad#c#onando o 8od#!#cador de Consulta F5: U(DA?E 5 mK$odo -or=pdate"+ 9abili$a vo'O a adi'ionar o modi-i'ador 67< =PDA;5 F sua 'onsul$a SDL. Exemplo 10.1-. Exemplo do m todo !orUpdate<=
<?php // .onstrWi esta consulta, // 4585.; 67< =PDA;5 p.J // 6<7M TproductsT A4 p $select $db3#select"+ 3#-or=pdate"+ 3#-ro)"array"'p' # 'products'++;

10.&.&. Executando Consultas Aelect


=s$a se>o des'reve 'omo e3e'u$ar a 'onsul$a represen$ada por um ob8e$o Zend!"b!Sele'$. 5*E1 *

10.&.&.1. Executando Consultas Aelect do Db Adapter ;o'O pode e3e'u$ar a 'onsul$a represen$ada pelo ob8e$o Zend!"b!Sele'$ passando<o 'omo primeiro ar.umen$o para o mK$odo query"+ de um ob8e$o Zend!"b!#dap$er!#bs$ra'$. )se os ob8e$os Zend!"b!Sele'$ ao invKs de um li$eral de 'onsul$a. 5 mK$odo query"+ re$orna um ob8e$o do $ipo Zend!"b!S$a$emen$ ou 0"5S$a$emen$M dependendo do $ipo de adap$ador. Exempl#o 10.11. Exemplo de uso do m todo 2uery<= do adaptador do banco de dados
<?php $select $db3#select"+ 3#-ro)"'products'+; $st)t $db3#query"$select+; $result $st)t3#-etchAll"+;

10.&.&.2. Executando Consultas Aelect a part#r de um 5b'eto &omo uma al$eran$iva para o uso do mK$odo query"+ do ob8e$o adap$adorM vo'O pode usar o mK$odo query"+ do ob8e$o Zend!"b!Sele'$. #mbos os mK$odos re$ornam um ob8e$o do $ipo Zend!"b!S$a$emen$ ou 0"5S$a$emen$M dependendo do $ipo de adap$ador. Exemplo 10.13. Exemplo de uso do m todo de consulta do ob'eto Aelect
<?php $select $db3#select"+ 3#-ro)"'products'+; $st)t $select3#query"+; $result $st)t3#-etchAll"+;

10.&.&.". Con,ertendo um 5b'eto Aelect para um 9#teral AJ9 Se vo'O pre'isar a'essar uma represen$a>o li$eral da 'onsul$a SDL 'orresponden$e ao ob8e$o Zend!"b!Sele'$M use o mK$odo __to4trin/"+. Exemplo 10.17. Exemplo do m todo __toAtr#n%<=
<?php $select $db3#select"+ 3#-ro)"'products'+; $sql $select3#__to4trin/"+;

5,E1 *

echo T$sqlUnT; // A saabda L o literal, // 4585.; J 6<7M TproductsT

10.&.-. 5utros m todos


=s$a se>o des'reve ou$ros mK$odos da 'lasse Zend!"b!Sele'$ Aue no so 'ober$os a'imaP /etPart"+ e reset"+. 10.&.-.1. :ecuperando (artes do 5b'eto Aelect 5 mK$odo /etPart"+ re$orna uma represen$a>o de uma par$e de sua 'onsul$a SDL. 0or e3emploM vo'O pode usar ese mK$odo para re$ornar o ve$or de e3press4es para a 'lusula >H5<5M ou o ve$or de 'olunas (ou e3press4es de 'oluna) Aue es$o na lis$a 4585.;M ou os valores da 'on$a.em e se.men$o para a 'lusula 89M9;. 5 valor de re$orno no K um li$eral 'on$endo um -ra.men$o de sin$a3e SDL. 5 valor de re$orno K uma represen$a>o in$ernaM Aue K $ipi'amen$e uma es$ru$ura de ve$or 'on$endo valores e e3press4es. &ada par$e da 'onsul$a $em uma es$ru$ura di-eren$e. 5 ar.umen$o simples para o mK$odo /etPart"+ K um li$eral Aue iden$i-i'a Aual par$e da 'onsul$a re$ornar. 0or e3emploM o li$eral '-ro)' iden$i-i'a a par$e do ob8e$o Sele'$ Aue armazena in-orma>4es sobre as $abelas na 'lusula 6<7MM in'luindo $abelas unidas. )ma 'lasse Zend!"b!Sele'$ de-ine 'ons$an$es Aue vo'O pode usar 'omo par$es da 'onsul$a SDL. ;o'O pode usar essas de-ini>4es de 'ons$an$esM ou os valores li$erais. ?abela 10.2. Constantes usadas por %et(art<= reset<= Constante Zend_Db_4elect,,D94;92.; Zend_Db_4elect,,67<_=PDA;5 Zend_Db_4elect,,.78=M24 Zend_Db_4elect,,6<7M Zend_Db_4elect,,>H5<5 Zend_Db_4elect,,:<7=P Zend_Db_4elect,,HAG92: Zend_Db_4elect,,7<D5< Zend_Db_4elect,,89M9;_.7=2; Calor l#teral 'distinct' '-orupdate' 'colu)ns' '-ro)' '!here' '/roup' 'haBin/' 'order' 'li)itcount'

Zend_Db_4elect,,89M9;_76645; 'li)ito--set'

5%E1 *

Exemplo 10.1;. Exemplo do m todo %et(art<=


<?php $select $db3#select"+ 3#-ro)"'products'+ 3#order"'product_id'+; // GocR pode usar u) literal para especi-icar a parte $orderData $select3#/etPart" 'order' +; // GocR pode usar u)a constante para especi-icar a )es)a parte $orderData $select3#/etPart" Zend_Db_4elect,,7<D5< +; // 7 Balor de retorno pode ser u)a estrutura de Betor( nFo u) literal // .ada parte te) u)a estrutura di-erente. print_r" $orderData +;

10.&.-.2. :ecompondo (artes do 5b'eto Aelect 5 mK$odo reset"+ 9abili$a vo'O a limpar uma par$e espe'i-i'ada da 'onsul$a SDLM ou eno limpar $odas as par$es da 'onsul$a SDL se vo'O omi$ir o ar.umen$o. 5 ar.umen$o simples K op'ional. ;o'O pode espe'i-i'ar a par$e da 'onsul$a a ser limpaM usando os mesmos li$erais Aue vo'O u$ilizou no ar.umen$o do mK$odo /etPart"+. # par$e da 'onsul$a Aue vo'O espe'i-i'ar ser re'ompos$a para um es$ado padro. Se vo'O omi$ir o par1me$roM reset"+ mudar $odas as par$es da 'onsul$a para seus es$ados padro. ?sso -az o ob8e$o Zend!"b!Sele'$ eAuivalen$e a um novo ob8e$oM ainda Aue vo'O $en9a ins$an'iado e3a$amen$e ele. Exemplo 10.30. Exemplo do m todo reset<=
<?php // .onstrWi esta consulta, // 4585.; p.J // 6<7M TproductsT A4 p // 7<D5< A@ Tproduct_na)eT $select $db3#select"+ 3#-ro)"array"'p' # 'products'+ 3#order"'product_na)e'+; // <equsito alterado( ao inBLs disso ordena por colunas di-erentes, // 4585.; p.J // 6<7M TproductsT A4 p // 7<D5< A@ Tproduct_idT // 8i)pa u)a parte assi) pode)os rede-ini3la $select3#reset" Zend_Db_4elect,,7<D5< +; // 5 especi-ica u)a coluna di-erente $select3#order"'product_id'+; // 8i)pa todas as partes da consulta $select3#reset"+;

55E1 *

10.-. Zend_Db_?able
10.-.1. Dntrodu./o N Classe ?able
# 'lasse Zend!"b!Table K uma in$er-a'e orien$ada a ob8e$os para $abelas de ban'os de dados. =la -orne'e mK$odos para mui$as opera>4es 'omuns sobre $abelas. # 'lasse base K es$ensCvelM assim vo'O pode adi'ionar lL.i'a 'us$omizada. # solu>o Zend!"b!Table K uma implemen$a>o do padro Table "a$a Ga$ewa+. # solu>o $ambKm in'lui uma 'lasse Aue implemen$a o padro 7ow "a$a Ga$ewa+.

10.-.2. De!#n#ndo uma Classe ?able


0ara 'ada $abela em seu ban'o de dados Aue vo'O Auer a'essarM de-ina uma 'lasse Aue es$enda Zend!"b!Table!#bs$ra'$. 10.-.2.1. De!#n#ndo o Nome e o Es2uema da ?abela "e'lare a $abela do ban'o de dados para a Aual essa 'lasse K de-inidaM usando a varivel pro$e.ida $_na)e. =la K um li$eralM e deve 'on$er o nome da $abela di.i$ado 'omo apare'e no ban'o de dados. Exemplo 10.31. Declarando uma classe de tabela com nome explKc#to de tabela
<?php class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s'; D

Se vo'O no espe'i-i'ar o nome da $abelaM o padro K o nome da 'lasse. Se vo'O 'on-iar no padroM o nome da 'lasse deve 'asar a di.i$a>o do nome da $abela 'omo ele apare'e no ban'o de dados. Exemplo 10.32. Declarando uma classe ?able com nome de tabela #mplKc#to
<?php class bu/s e*tends Zend_Db_;able_Abstract C // no)e da tabela casa co) no)e da classe D

5/E1 *

;o'O $ambKm pode de'larar o esAuema para a $abelaM ou 'om a varivel pro$e.ida $_sche)aM ou 'om o esAuema 'olo'ado para o nome da $abela na propriedade $_na)e. DualAuer esAuema espe'i-i'ado 'om a propriedade $_na)e $em pre'edOn'ia sobre um esAuema espe'i-i'ado 'om a propriedade $_sche)a. =m al.umas mar'as de 7"(:S o $ermo para esAuema K Tda$abaseU ou T$ablespa'eUM mas K usado de -orma similar. Exemplo 10.3". Declarando uma classe ?able com es2uema
<?php // Pri)eira alternatiBa class Au/s e*tends Zend_Db_;able_Abstract C protected $_sche)a 'bu/_db'; protected $_na)e 'bu/s'; D // 4e/unda alternatiBa, class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/_db.bu/s'; D // 4e os esque)as sFo especi-icados tanto e) $_na)e quanto $_sche)a( // o especi-icado e) $_na)e te) pre-erRncia, class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/_db.bu/s'; protected $_sche)a 'i/nored'; D

5s nomes de $abela e esAuemas podem $ambKm ser espe'i-i'ados via dire$ivas de 'on-i.ura>o do 'ons$ru$orM o Aue sobres'reve AuaisAuer valores padro espe'i-i'ados 'om as propriedades $_na)e e $_sche)a. )ma espe'i-i'a>o de esAuema dada 'om a dire$iva na)e sobres'reve AualAuer valor -orne'ido 'om a op>o sche)a. Exemplo 10.3&. Declarando nomes de tabela e es2uema na #nstanc#a./o
<?php class Au/s e*tends Zend_Db_;able_Abstract C D // Pri)eira alterantiBa, $tableAu/s ne! Au/s"array"'na)e' # 'bu/s'( 'sche)a' # 'bu/_db'++; // 4e/unda alternatiBa, $tableAu/s ne! Au/s"array"'na)e' # 'bu/_db.bu/s'+; // 4e esque)as sFo especi-icados tanto e) 'na)e' quanto 'sche)a'( // o especi-icado e) 'na)e' te) pre-erRncia, $tableAu/s ne! Au/s"array"'na)e' # 'bu/_db.bu/s'( 'sche)a' # 'i/nored'+;

52E1 *

Se vo'O no espe'i-i'ar o nome do esAuemaM o padro K o esAuema para o Aual sua ins$1n'ia de adap$ador de ban'o de dados es$ 'one'$ada. 10.-.2.2. De!#n#ndo a C*a,e (r#mMr#a da ?abela &ada $abela deve $er uma '9ave primria. ;o'O pode de'larar a 'oluna para a '9ave primria usando a varivel pro$e.ida $_pri)ary. ?sso K ou um li$eral Aue nomeia a 'oluna simples para a '9ave primriaM ou en$o um ve$or de nomes de 'oluna se sua '9ave primria K uma '9ave 'ompos$a. Exemplo 10.3-. Exemplo de espec#!#ca./o de c*a,e pr#mMr#a
<?php class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s'; protected $_pri)ary 'bu/_id'; D

Se vo'O no espe'i-i'ar a '9ave primriaM Zend!"b!Table!#bs$ra'$ $en$a des'obrir a '9ave primria baseada na in-orma>o -orne'ida pelo mK$odo describe;able"+. Nota &ada 'lasse Table deve 'on9e'er Auais 'olunas podem ser usadas para endere>ar lin9as de -orma Nni'a. Se no 9ouver 'olunas de '9ave primria espe'i-i'adas na de-ini>o da 'lasse $abela ou nos ar.umen$os do 'ons$ru$or da $abelaM ou des'ober$as nos me$adados de $abela -orne'idos por describe;able"+M en$o a $abela no pode ser usada 'om Zend!"b!Table. 10.-.2.". Aobrescre,endo 8 todos de Con!#%ura./o de ?able Duando vo'O 'ria uma ins$1n'ia de uma 'lasse TableM o 'ons$ru$or '9ama um 'on8un$o de mK$odo pro$e.idos Aue ini'ializam me$adados para a $abela. ;o'O pode es$ender AualAuer um desses mK$odos para de-inir me$adados e3pli'i$amen$e. Lembre de '9amar o mKodo de mesmo nome na 'lasse me ao -im de seu mK$odo. Exemplo 10.31. Exemplo de sobrescr#ta do m todo _setup?ableName<=
<?php class Au/s e*tends Zend_Db_;able_Abstract C protected -unction _setup;able2a)e"+ C $this3#_na)e 'bu/s'; parent,,_setup;able2a)e"+; D

5@E1 *

5s mK$odos de 'on-i.ura>o Aue vo'O pode sobres'rever so os se.uin$esP

_setupDatabaseAdapter"+ veri-i'a se um adap$ador -oi -orne'idoZ ob$Km um adap$ador do re.is$ro se -or ne'essrio. 0ela sobres'ri$a desse mK$odoM vo'O pode 'on-i.urar um adap$ador de ban'o de dados da ou$ra -on$e. _setup;able2a)e"+ de-ine 'omo padro para o nome de $abela o nome da 'lasse. 0ela sobres'ri$a desse mK$odoM vo'O pode 'on-i.urar o nome da $abela an$es desse 'ompor$amen$o padro rodar. _setupMetadata"+ 'on-i.ura o esAuema se o nome da $abela 'on$iver o padro Rs'9ema.$ableRZ '9ame describe;able"+ para ob$er in-orma>4es de me$adadosZ de-ine 'omo padro para o ve$or $_cols as 'olunas repor$adas por describe;able"+. 0ela sobres'ri$a desse mK$odoM vo'O pode espe'i-i'ar as 'olunas. _setupPri)aryIey"+ de-ine 'omo padro para as 'olunas de '9ave primria aAuelas repor$adas por describe;able"+Z veri-i'a se as 'olunas de '9ave primria es$o in'luCdas no ve$or $_cols. 0ela sobre'ri$a desse mK$odoM vo'O pode espe'i-i'ar as 'olunas de '9ave primria.

10.-.2.&. ?able #n#t#al#$at#on Se a lL.i'a espe'C-i'a da apli'a>o pre'isa ser ini'ializada Auando uma 'lasse Table K 'ons$ruCdaM vo'O pode de'idir<se por mover suas $are-as para o mK$odo init"+M o Aual K '9amado depois Aue $odos os me$adados de Table -oram pro'essados. ?sso K re'omendvel sobre o mK$odo __construct se vo'O no pre'isar al$erar os me$adados de AualAuer modo pro.ram$i'o. Exemplo 10.33. Exemplo de uso do m todo #n#t<=
<?php class Au/s e*tends Zend_Db_;able_Abstract C protected $_obserBer; protected -unction init"+ C $this3#_obserBer ne! My7bserBer.lass"+; D D

56E1 *

10.-.". Cr#ando uma Dnst)nc#a de ?able


#n$es de usar uma 'lasse TableM 'rie uma ins$1n'ia usando seu 'ons$ru$or. 5 ar.umen$o do 'ons$ru$or K um ve$or de op>4es. # op>o mais impor$an$e para um 'ons$ru$or Table K a ins$1n'ia do adap$ador do ban'o de dadosM represen$ando um 'one3o a$iva 'om o 7"(:S. I $rOs modos de espe'i-i'ar o adap$ador de ban'o de dados para uma 'lasse TableM e esses $rOs modos so des'ri$os abai3oP 10.-.".1. Espec#!#cando um Adaptador de Banco de Dados 5 primeiro modo de -orne'er um adap$ador de ban'o de dados para uma 'lasse Table K passando<o 'omo um ob8e$o do $ipo Zend!"b!#dap$er!#bs$ra'$ no ve$or de op>4esM iden$i-i'ado pela '9ave 'db'. Exemplo 10.37. Exemplo de constru./o de ?able usando um ob'eto Adapter
<?php $db Zend_Db,,-actory"'PD7_M@4?8'( $options+; $table ne! Au/s"array"'db' # $db++;

10.-.".2. Con!#%urando um Adaptador de Banco de Dados (adr/o 5 se.undo modo de -orne'er um adap$ador de ban'o de dados para uma 'lasse Table K de'larando um ob8e$o do $ipo Zend!"b!#dap$er!#bs$ra'$ para ser um adap$ador de ban'o de dados padro para $odas as ins$1n'ias subseAWen$es de Tables em sua apli'a>o. ;o'O pode -azer isso 'om o mK$odo es$$i'o Zend_Db_;able_Abstract,,setDe-aultAdapter"+. 5 ar.umen$o pe um ob8e$o do $ipo Zend!"b!#dap$er!#bs$ra'$. Exemplo 10.3;. Exemplo de constru./o de um ?able usando o Adaptador (adr/o
<?php $db Zend_Db,,-actory"'PD7_M@4?8'( $options+; Zend_Db_;able_Abstract,,setDe-aultAdapter"$db+; // 8ater... $table ne! Au/s"+;

?sso pode ser 'onvenien$e para 'riar o ob8e$o adap$ador do ban'o de dados em um lo'al 'en$ral de sua apli'a>oM $al 'omo o boo$s$rapM e en$o armazen<lo 'omo o adap$ador padro. ?sso d a vo'O um meio de .aran$ir Aue a ins$1n'ia do adap$ador se8a a mesma duran$e $oda a sua apli'a>o. =n$re$an$oM a 'on-i.ura>o de um adap$ador padro es$ limi$ada a uma Nni'a ins$1n'ia de adap$ador.

/ E1 *

10.-.".". Arma$enando um Adaptador de Banco de Dados no :e%#stro 5 $er'eiro modo de -orne'er um adap$ador de ban'o de dados para um 'lasse Table K passando um li$eral no ve$or de op>4esM $ambKm iden$i-i'ado pela '9ave 'db'. 5 li$eral K usado 'omo uma '9ave para a ins$1n'ia es$$i'a Zend!7e.is$r+M onde a en$rada naAuela '9ave K um ob8e$o do $ipo Zend!"b!#dap$er!#bs$ra'$. Exemplo 10.70. Exemplo de constru./o de um ?able usando a c*a,e :e%#stry
<?php $db Zend_Db,,-actory"'PD7_M@4?8'( $options+; Zend_<e/istry,,set"')y_db'( $db+; // Mais tarde... $table ne! Au/s"array"'db' # ')y_db'++;

Tal 'on-i.ura>o do adap$ador padro d a vo'O meios de .aran$ir Aue a mesma ins$1n'ia de adap$ador se8a usada duran$e sua apli'a>o. )sar o re.is$ro K mais -le3CvelM porAue vo'O pode armazenar mais Aue um adap$ador por ins$1n'ia. )ma ins$1n'ia de um dado adap$ador K espe'C-i'a para 'er$as mar'as de 7"(:S e ins$1n'ias de ban'o de dados. Se sua apli'a>o pre'isa de a'esso para mNl$iplos ban'os de dados ou mesmo mNl$iplas mar'as de ban'o de dadosM en$o vo'O pre'isa usar mNl$iplos adap$adores.

10.-.&. Dnclu#ndo 9#n*as em uma ?abela


;o'O pode usar o o8e$o Table para inserir lin9as em um $abela de ban'o de dados na Aual o ob8e$o Table es$ baseada. )se o mK$odo insert"+ de seu ob8e$o Table. 5 ar.umen$o K um ve$or asso'ia$ivoM mapeando nomes de 'olunas para valores. Exemplo 10.71. Exemplo de #nclus/o em um ?able
<?php $table ne! Au/s"+; $data array" 'created_on' # '%''&3'O3%%'( 'bu/_description' # '4o)ethin/ !ron/'( 'bu/_status' # '25>' +; $table3#insert"$data+;

0or padroM os valores em seu ve$or de dados so inseridos 'omo valores li$eraisM usando par1me$ros. Se vo'O no pre'isar Aue eles se8am $ra$ados 'omo e3press4es SDLM vo'O deve 'er$i-i'ar<se de Aue eles so dis$in$os de li$erais puros. )se um ob8e$o do $ipo Zend!"b!=3pr para -azer isso.

/1E1 *

Exemplo 10.72. Exemplo de #nclus/o de express4es em um ?able


<?php $table ne! Au/s"+; $data array" 'created_on' 'bu/_description' 'bu/_status' +;

# ne! Zend_Db_5*pr"'.=<DA;5"+'+( # '4o)ethin/ !ron/'( # '25>'

Bos e3emplos de inser>o de lin9as a'imaM K assumido Aue a $abela $em uma '9ave primria au$oin'remen$al. =sse K o 'ompor$amen$o padro de Zend!"b!Table!#bs$ra'$M mas 9 ou$ros $ipos de '9aves primrias. #s se>4es se.uin$es des'revem 'omo supor$ar d-eren$es $ipos de '9aves primrias 10.-.&.1. Usar um ?able com uma C*a,e de Auto0#ncremental )ma '9ave primria au$o<in'remen$al .era um valor in$eiro Nni'o se vo'O omi$ir a 'oluna de '9ave primria de sua de'lara>o SDL 9245<;. =m Zend!"b!Table!#bs$ra'$M se vo'O de-inir a varivel pro$e.ida $_sequence para ser o valor booleano trueM en$o a 'lasse assume Aue a $abela $em uma '9ave primria au$o<in'remen$al. Exemplo 10.7". Exemplo de declara./o de um ?able com c*a,e pr#mMr#a auto#ncremental
<?php class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s'; // 5sse L o padrFo na classe Zend_Db_;able_Abstract class; // BocR nFo precisa de-inir isso. protected $_sequence true; D

:+SDLM :i'roso-$ SDL ServerM e SDLi$e so e3emplos de mar'as de 7"(:S Aue supor$am '9aves primrias au$oin'remen$ais. 0os$.reSDL $em uma no$a>o 45<9A8 Aue impli'i$amen$e de-ine uma seAWen'ia baseada na $abela e no nome da 'olunaM e usa a seAWen'ia para .erar valores de '9ave para novas lin9as. ?(: "(* $em uma no$a>o 9D52;9;@ Aue -un'iona de -orma similar. Se vo'O usa uma dessas no$a>4esM $ra$e sua 'lasse Zend!"b!Table 'omo $endo uma 'oluna au$oin'remen$al Aue diz respei$o F de'lara>o do membro $_sequence 'omo true.

/*E1 *

10.-.&.2. Usando um ?able com um Ae2uence )ma seAWen'ia K um ob8e$o de ban'o de dados Aue .era um valor Nni'oM Aue pode ser usado 'omo um valor de '9ave primria em um ou mais $ables o- $9e da$abase. Se vo'O de-inir $_sequence 'omo sendo um li$eralM en$o Zend!"b!Table!#bs$ra'$ assume Aue o li$eral nomeia um ob8e$o de seAWen'ia no ban'o de dados. # seAWen'ia K invo'ada para .erar um novo valorM e esse valor K usado na opera>o 9245<;. Exemplo 10.7&. Exemplo de declara./o de um ?able com uma se2Eenc#a
<?php class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s'; protected $_sequence 'bu/_sequence'; D

5ra'leM 0os$.reSDLM e ?(: "(* so e3emplos de mar'as de 7"(:S brands Aue supor$am ob8e$os de seAWen'ia no ban'o de dados. 0os$.reSDL e ?(: "(* $em $ambKm sin$a3e Aue de-ine seAWen'ias impli'i$amen$e e asso'ia<as 'om 'olunas. Se vo'O usar essa no$a>oM $ra$a a $abela 'omo $endo uma 'oluna de '9ave au$oin'remen$al. "e-ina o nome da seAWen'ia 'omo um li$eral somen$e em 'asos onde vo'O invo'aria a seAWen'ia e3pli'i$amen$e para ob$er o prL3imo valor de '9ave. 10.-.&.". Uando um ?able com uma C*a,e Natural #l.umas $abelas $em um '9ave na$ural. ?sso Auer dizer Aue o dado no K au$oma$i'amen$e .erado pela $abela ou pela seAWen'ia. ;o'O deve espe'i-i'ar o valor para a '9ave primria nesse 'aso. Se vo'O de-inir Aue $_sequence se8a o valor booleano -alseM en$o Zend!"b!Table!#bs$ra'$ assume Aue a $abela $em uma '9ave primria na$ural. ;o'O deve -orne'er valores para as 'olunas de '9ave primria no ve$or de dados ao mK$odo insert"+M 'aso 'on$rrio esse mK$odo lan>a uma Zend!"b!Table!=3'ep$ion. Exemplo 10.7-. Exemplo de declara./o de um ?able com uma c*a,e natural
<?php class Au/4tatus e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/_status'; protected $_sequence -alse; D

/,E1 *

Nota Todas as mar'as de 7"(:S supor$am $abelas 'om '9aves na$urais. =3emplos de $abelas Aue so -reAWen$emen$e de'laradas 'omo $endo '9aves na$urais so $abelas de bus'aM $abelas de in$erse'>o em rela'ionamen$os muios<para<mui$osM ou a maioria das $abelas 'om '9aves primrias 'ompos$as.

10.-.-. Atual#$ando 9#n*as em um ?able


;o'O pode a$ualizar lin9as em uma $abela de ban'o de dados usando o mK$odo update da 'lasse Table. =sse mK$odo leva dois ar.umen$osP um ve$or asso'ia$ivo de 'olunas a serem al$eradas e novos valores a serem asso'iados a essas 'olunasZ e uma e3presso SDL Aue K usada em uma 'lusula 'lusula >H5<5 . Exemplo 10.71. Exemplo de atual#$a./o de dados em um ?able
<?php $table ne! Au/s"+; $data array" 'updated_on' # '%''&3'O3%O'( 'bu/_status' # '69S5D' +; $!here $table3#/etAdapter"+3#quote9nto"'bu/_id $table3#update"$data( $!here+;

?'( $%OV+;

)ma vez Aue o mK$odo update"+ represen$a o mK$odo update"+ do adap$ador de ban'o de dadosM o se.undo ar.umen$o pode ser um ve$or de e3press4es SDL. #s e3press4es so 'ombinadas 'omo $ermos booleanos usando um operador A2D. Nota 5s valores e iden$i-i'adores na e3presso SDL no so 'i$ados para vo'O. Se vo'O $em os valores e iden$i-i'adores Aue reAuerem 'i$a>oM vo'O K responsvel por -azer isso. )se os mK$odos quote"+M quote9nto"+M e quote9denti-ier"+ do adap$ador do ban'o de dados.

10.-.1. Exclu#ndo 9#n*as de um ?able


;o'O pode apa.ar lin9as de uma $abela de ban'o de dados usando o mK$odo delete"+. =sse mK$odo leva um ar.umen$oM o Aual K uma e3presso SDL Aue K usada em um 'lusula >H5<5M 'omo 'ri$Krio para as lin9as a serem apa.adas. Exemplo 10.73. Exemplo de exclus/o de um ?able
<?php $table

ne! Au/s"+;

/%E1 *

$!here $table3#/etAdapter"+3#quote9nto"'bu/_id $table3#delete"$!here+;

?'( $%OZ+;

5 se.undo ar.umen$o pode ser um ve$or de e3press4es SDL. #s e3press4es so 'ombinadas 'omo $ermos booleanos usando um operador A2D. )ma vez Aue o mK$odo delete"+ da $abela represen$a o mK$odo delete"+ do adap$ador de ban'o de dadosM o se.undo ar.umen$o pode ser um ve$or de e3press4es SDL. #s e3press4es so 'ombinadas 'omo $ermos booleanos usando um operador A2D. Nota 5S valores e iden$i-i'adores na e3presso SDL no so 'i$ados para vo'O. Se vo'O $em valores ou iden$i-i'adores Aue reAuerem 'i$a>oM vo'O K responsvel por -azer isso. Se vo'O $iver valores ou iden$i-i'adores Aue reAuerem 'i$a>oM vo'O K responsvel por -azer isso. )se os mK$odos quote"+M quote9nto"+M e quote9denti-ier"+ do adap$ador de ban'o de dados.

10.-.3. (rocurando 9#n*as pela C*a,e (r#mMr#a


;o'O pode 'onsul$ar uma $abela do ban'o de daods pro'urando por lin9as Aue 'asem valores espe'C-i'os na '9ave primriaM usando o mK$odo -ind"+. 5 primeiro ar.umen$o desse mK$odo K ou um valor simples ou um ve$or de valoresM para 'asar 'on$ra a '9ave primria da $abela. Exemplo 10.77. Exemplo de busca de l#n*as por ,alores de c*a,e pr#mMr#a
<?php $table ne! Au/s"+; // Procura u)a linha si)ples // <eturns a <o!set $ro!s $table3#-ind"$%OV+; // 6ind )ultiple ro!s // Also returns a <o!set $ro!s $table3#-ind"array"$%OV( Zc&]++;

Se vo'O espe'i-i'ar um valor simplesM o mK$odo re$orna no m3imo uma Nni'a lin9aM porAue uma '9ave primria no pode $er valores dupli'ados e 9 no m3imo uma lin9a na $abela do ban'o de dados Aue 'asa 'om o valor Aue vo'O espe'i-i'ar. Se vo'O espe'i-i'ar mNl$iplos valores em um ve$orM o mK$odo re$orna $an$as lin9as Auan$o o nNmero de valores dis$in$os Aue vo'O espe'i-i'ar. 5 mK$odo -ind"+ pode re$ornar menos lin9as do Aue o nNmero de valores Aue vo'O espe'i-i'ar para a '9ave primriaM se al.um dos valores no 'asar 'om AuaisAuer lin9as na $abela do ban'o de dados. 5 mK$odo pode a$K re$ornar zero lin9as. &omo o nNmero de lin9as re$ornadas K varivelM o mK$odo -ind"+ re$orna um ob8e$o do $ipo Zend_Db_;able_<o!set_Abstract. /5E1 *

Se a '9ave primria K uma '9ave 'ompos$aM isso KM 'onsis$e de mNl$iplas 'olunasM vo'O pode espe'i-i'ar as 'olunas adi'ionais 'omo ar.umen$os adi'ionais para o mK$odo -ind"+. ;o'O deve -orne'er $an$os ar.umen$os Auan$os -orem o nNmero de 'olunas na '9ave primria da $abela. 0ara pro'urar mNl$iplas lin9as de uma $abela 'om uma '9ave primria 'ompos$aM -orne>a um ve$or para 'ada um dos ar.umen$os. Todos esses ve$ores devem $er o mesmo nNmero de elemen$os. 5s valores em 'ada ve$or so -ormados em $uplas ordenadasZ por e3emploM o primeiro elemen$o em $odos os ar.ume$nos de ve$or de-ine o primeiro valor da '9ave primria 'ompos$aM en$o o se.undo elemen$o de $odos os ve$ores de-ine o se.undo valor da '9ave primria 'ompos$aM e assim por dian$e. Exemplo 10.7;. Exemplo de busca de l#n*as por ,alores de c*a,e pr#mMr#a composta &9amar -ind"+ abai3o para 'asar mNl$iplas lin9as pode 'asar duas lin9as no ban'o de dados. # primeira lin9a deve $er valor de '9ave primria (1*,%M Q#(&Q)M e a se.unda lin9a deve $er valor de '9ave primria (5/2@M Q"=FQ).
<?php class Au/sProducts e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s_products'; protected $_pri)ary array"'bu/_id'( 'product_id'+; D $table ne! Au/sProducts"+; // Procura u)a linha si)ples co) u)a chaBe pri)\ria. // <etorna u) <o!set $ro!s $table3#-ind"$%OV( 'AA.'+; // Procura )Pltiplas linhas co) chaBes pri)\rias co)postas // ;a)bL) retorna u) <o!set $ro!s $table3#-ind"array"$%OV( Zc&]+( array"'AA.'( 'D56'++;

10.-.7. Consultando um Con'unto de 9#n*as


10.-.7.1. A(D Aelect Ad,ertFnc#a # #0? para opera>4es de bus'a -oi modi-i'ada para permi$ir Aue um ob8e$o Zend_Db_;able_4elect modi-i'asse a 'onsul$a. =n$re$an$oM o uso desaprovado dos mK$odos -etch<o!"+ e -etchAll"+ 'on$inuar a -un'ionar sem modi-i'a>o. #s se.uin$es de'lara>4es so $odas le.ais e -un'ionalmen$e idOn$i'asM en$re$an$o K re'omendvel a$ualizar seu 'Ldi.o para levar van$a.em do novo uso Auando possCvel.
// Auscando u) ro!set $ro!s $table3#-etchAll"'bu/_status T25>T'( 'bu/_id A4.'( $'( '+; $ro!s $table3#-etchAll"$table3#select"+3#!here"'bu/_status ?'( '25>'+

//E1 *

3#order"'bu/_id A4.'+ 3#li)it"$'( '++; // Auscando u)a linha si)ples $ro! $table3#-etch<o!"'bu/_status T25>T'( 'bu/_id A4.'+; $ro! $table3#-etch<o!"$table3#select"+3#!here"'bu/_status ?'( '25>'+ 3#order"'bu/_id A4.'++;

5 ob8e$o Zend_Db_;able_4elect K uma e3$enso do ob8e$o Zend_Db_4elect Aue apli'a res$ri>4es espe'C-i'as F 'onsul$a. #s a.re.a>4es e res$ri>4es soP

;o'O pode de'idir re$ornar um sub'on8un$o de 'olunas den$ro de uma 'onsul$a -e$'97ow ou -e$'9#ll. ?sso pode -orne'er bene-C'ios de o$imiza>o Auando re$ornar um 'on8un$o mui$o .rande de resul$ados para $odas as 'olunas no -or dese8vel. ;o'O pode espe'i-i'ar 'olunas Aue avaliam e3press4es de den$ro da $abela sele'ionada. =n$re$an$o isso si.ni-i'ar Aue a lin9a ou 'on8un$o de lin9as re$ornado ser somen$e lei$ura e no poder ser usado para opera>4es save(). )m ob8e$o Zend_Db_;able_<o! 'om s$a$us read5nl+ ir lan>ar uma e3'e>o se uma opera>o saBe"+ -or $en$ada. ;o'O pode permi$ir 'lusulas G5?B sobre um sele'$ para permi$ir bus'as em mNl$iplas $abelas. ;o'O no pode espe'i-i'ar Aue 'olunas de uma $abela a-e$ada por G5?B sero re$ornadas em uma lin9aE'on8un$o de lin9as. Fazer isso ir prova'ar um erro 0I0. ?sso -oi -ei$o para .aran$ir Aue a in$e.ridade Zend_Db_;able -osse )antida.M is$o KM um Zend_Db_;able_<o! deve somen$e re-eren'iar 'olunas derivadas de sua $abela me.

Example 10.;0. Uso s#mples


<?php $table ne! Au/s"+; $select $table3#select"+; $select3#!here"'bu/_status ?'( '25>'+; $ro!s $table3#-etchAll"$select+;

?n$er-a'es -luen$es so implemen$adas a$ravKs do 'omponen$eM assim isso pode ser rees'ri$o de uma -orma mais abreviada. Exemplo 10.;1. Exemplo de #nter!ace !luente
<?php $table $ro!s

ne! Au/s"+; $table3#-etchAll"$table3#select"+3#!here"'bu/_status

?'( '25>'++;

/2E1 *

10.-.7.2. Buscando um con'unto de l#n*as ;o'O pode 'onsul$ar um 'on8un$o de lin9as usando AualAuer 'ri$Krio Aue no se8am os valores da '9ave primriaM usando o mK$odo -etchAll"+ da 'lasse Table. =sse mK$odo re$orna um ob8e$o do $ipo Zend_Db_;able_<o!set_Abstract. Exemplo 10.;2. Exemplo de busca de l#n*as por uma express/o
<?php $table ne! Au/s"+; $select $table3#select"+3#!here"'bu/_status $ro!s $table3#-etchAll"$select+;

?'( '25>'+;

;o'O pode $ambKm passar um 'ri$Krio de 'lassi-i'a>o em uma 'lusula 7<D5< A@M assim 'omo 'on$a.em e valores in$eir$os de se.men$oM usados para -azer a 'onsul$a re$ornar um sub'on8un$o espe'C-i'o de lin9as. =sses valores so usados em uma 'lusula 89M9;M ou em lL.i'a eAuivalen$e para mar'as de 7"(:S Aue no supor$am a sin$a3e 89M9;. Exemplo 10.;". Exemplo de busca de l#n*as por uma express/o
<?php $table ne! Au/s"+; $order 'bu/_id'; // <etorna da %$d a O'd linhas $count $'; $o--set %'; $select $table3#select"+3#!here"array"'bu/_status 3#order"$order+ 3#li)it"$count( $o--set+; $ro!s $table3#-etchAll"$select+;

?'

# '25>'++

Todos os ar.umen$os a'ima so op'ionais. Se vo'O omi$ir a 'lusula 57"=7M o 5b8e$o 7owse$ in'lui lin9as da $abela em uma ordem imprevisCvel. Se a 'lusula L?:?T no es$iver 'on-i.uradaM vo'O re'uperar 'ada lin9a na $abela Aue 'asar 'om a 'lusula HI=7=. 10.-.7.". Uso a,an.ado 0ara reAuisi>4es mais espe'C-i'as e o$imizadasM vo'O pode Auerer limi$ar o nNmero de 'olunas re$ornadas em uma lin9aE'on8un$o de lin9as. ?sso pode ser 'onse.uido pela passa.em da 'lusula F75: para o ob8e$o sele'$. 5 primeiro ar.umen$o na 'lusula F75: K idOn$i'o ao Aue o ob8e$o Zend!"b!Sele'$ usa 'om a adi>o de ser 'apaz de passar uma ins$1n'ia de Zend!"b!Table!#bs$ra'$ e de$erminar au$oma$i'amen$e o nome da $abela. Exemplo 10.;&. :etornar colunas especK!#cas /@E1 *

<?php $table ne! Au/s"+; $select $table3#select"+; $select3#-ro)"$table( array"'bu/_id'( 'bu/_description'++ 3#!here"'bu/_status ?'( '25>'+; $ro!s $table3#-etchAll"$select+;

Dmportante 5 'on8un$o de lin9as 'on$Om lin9as Aue ainda so QvlidasQ _ elas simplesmen$e 'on$Om um sub'on8un$o de uma $abela. Se um mK$odo save() -or '9amado sobre uma lin9a par'ial en$o somen$e os 'ampos disponCveis sero modi-i'ados. ;o'O pode $ambKm espe'i-i'ar e3press4es den$ro da 'lusula F75: e $O<las re$ornadas 'omo lin9asE'on8un$os de lin9as. Besse e3emplo re$ornaremos lin9as da $abela bu.s Aue mos$ram uma a.re.a>o do nNmero de novos bu.s repor$ados por indivCduos. Bo$e a 'lusula G75)0. # 'oluna Q'oun$Q -i'ar disponCvel para avalia>o da lin9a e poder ser a'essada 'omo se -osse par$e do esAuema. Exemplo 10.;-. :ecuperando express4es como colunas
<?php $table ne! Au/s"+; $select $table3#select"+; $select3#-ro)"$table( array"'.7=2;"reported_by+ as ecounte'( 'reported_by'++ 3#!here"'bu/_status ?'( '25>'+ 3#/roup"'reported_by'+; $ro!s $table3#-etchAll"$select+;

;o'O $ambKm pode usar um 'ampo de bus'a 'omo par$e de sua 'onsul$a para re-inar suas opera>4es de bus'a. Bes$e e3emploM a $abela a''oun$s K 'onsul$ada 'omo par$e de uma pesAuisa por $odos os novos bu.s repor$ados por Q(obQ. Exemplo 10.;1. Usando uma tabela de busca para re!#nar os resultados de !etc*All<=
<?php $table ne! Au/s"+; $select $table3#select"+; $select3#!here"'bu/_status ?'( '25>'+ 3#1oin"'accounts'( 'accounts.account_id bu/s.reported_by'+ 3#!here"'accounts.account_na)e ?'( 'Aob'+; $ro!s $table3#-etchAll"$select+;

# 'lasse Zend_Db_;able_4elect K usada primariamen$e para res$rin.ir e validar de modo Aue /6E1 *

ela possa -or>ar os 'ri$Krios para uma 'onsul$a S=L=&T le.al. =n$re$an$o podem 9aver 'er$os 'asos onde vo'O reAueira a -le3ibilidade do 'omponen$e Zend!"b!Table!7ow e no reAueira uma lin9a .ravvel ou apa.vel. 0ara esse 'aso de uso espe'C-i'oM K possCvel re'uperar uma lin9aE'on8un$o de lin9as pela passa.em de um valor -also para se$?n$e.ri$+&9e'k. # lin9aE'on8un$o de lin9as resul$an$e ser re$ornada 'omo uma lin9a QbloAueadaQ (si.ni-i'ando Aue save()M dele$e() e AuaisAuer mK$odos 'on-i.uradores de 'ampo lan>aro uma e3'e>o). Exemplo 10.;3. :emo,endo a ,er#!#ca./o de #nte%r#dade sobre Zend_Db_?able_Aelect para perm#t#r l#n*as un#das <B5DNed=
<?php $table ne! Au/s"+; $select $table3#select"+3#set9nte/rity.hecX"-alse+; $select3#!here"'bu/_status ?'( '25>'+ 3#1oin"'accounts'( 'accounts.account_id bu/s.reported_by'( 'account_na) e'+ 3#!here"'accounts.account_na)e ?'( 'Aob'+; $ro!s $table3#-etchAll"$select+;

10.-.;. Consultando uma 9#n*a A#mples


;o'O pode 'onsul$ar uma lin9a simples usando 'ri$Krios similares ao usados pelo mK$odo -etchAll"+. Exemplo 10.;7. Exemplo de busca de uma l#n*a s#mples por uma express/o
<?php $table $select $ro!

ne! Au/s"+; $table3#select"+3#!here"'bu/_status 3#order"'bu/_id'+; $table3#-etch<o!"$!here+;

?'( '25>'+

=sse mK$odo re$orna um ob8e$o do $ipo Zend!"b!Table!7ow!#bs$ra'$. Se o 'ri$Krio de bus'a Aue vo'O espe'i-i'ou no 'asa 'om lin9a al.uma na $abela do ban'o de dadosM en$o -etch<o!"+ re$orna o valor null do 0I0.

10.-.10. :ecuperando Dn!orma.4es de 8etadados de ?abelas


# 'lasse Zend!"b!Table!#bs$ra'$ -orne'e al.umas in-orma>4es sobre seus me$adados. 5 mK$odo in-o"+ re$orna uma es$ru$ura de ve$or 'om in-orma>4es sobre a $abelaM suas 'olunas e '9ave primriaM e ou$ros me$adados. Exemplo 10.;;. Exemplo de obten./o do nome da tabela 2 E1 *

<?php $table ne! Au/s"+; $in-o $table3#in-o"+; echo T;he table na)e is T . $in-oM'na)e'N . TUnT;

#s '9aves do ve$or re$ornado pelo mK$odo in-o"+ so des'ri$as abai3oP


name `a o nome da $abela. cols `a um ve$orM nomeando a(s) 'oluna(s) da $abela. pr#mary `a um ve$orM nomeando a(s) 'oluna(s) na '9ave primria. metadata `a um ve$or asso'ia$ivoM mapeando nomes de 'oluna para in-orma>4es sobre as 'olunas. ?sso K a in-orma>o re$ornada pelo mK$odo describe;able"+. ro+Class `a o nome da 'lasse 'on're$a usada pelos ob8e$os 7ow re$ornados pelos mK$odos dessa ins$1n'ia de $abela. Seu padro K Zend!"b!Table!7ow. ro+setClass `a o nome da 'lasse 'on're$a usada para ob8e$os 7owse$ re$ornados por mK$odos dessa ins$1n'ia de $abela. Seu padro K Zend!"b!Table!7owse$. re!erence8ap `a um ve$or asso'ia$ivoM 'om in-orma>4es sobre re-erOn'ias dessa $abela para AualAuer $abela me. ;e8a Se>o 1 .@.*M T"e-inindo 7ela'ionamen$osU. dependent?ables `a um ve$or de nomes de 'lasse de $abelas Aue re-eren'iam essa $abela. ;e8a Se>o 1 .@.*M T"e-inindo 7ela'ionamen$osU. sc*ema `a o nome do esAuema (ou ban'o de dados ou $ablespa'e) para essa $abela.

10.-.11. Cac*eando 8etadados de ?abela


0or padroM Zend_Db_;able_Abstract 'onsul$a os ban'os de dados sub8a'en$es para me$adados de $abela sobre ins$an'ia>o de um ob8e$o $abela. ?s$o KM Auando um novo ob8e$o $abela K 'riadoM o 'ompor$amen$o padro do ob8e$o K bus'ar os me$adados da $abela a par$ir do ban'o de dados usando o mK$odo describe;able"+ do adap$ador. =m al.umas 'ir'uns$1n'iasM par$i'ularmen$e Auando mui$os ob8e$os $abela so ins$an'iados 'on$ra o mesmo ban'o de dadosM 'onsul$ar o ban'o de dados por me$adados de $abela para 'ada ins$1n'ia pode ser indese8vel -o pon$o de vis$a de per-orman'e. =m $ais 'asosM usurios podem se bene-i'iar pelo 'a'9eamen$o de me$adados de $abela re'uperados a par$ir do ban'o de dados. I dois modos primrios nos Auais um usurio pode levar van$a.em do 'a'9eamen$o de me$adados de $abelaP

C*amando Zend_Db_?able_Abstract>>setDe!ault8etadataCac*e<= < ?sso permi$e Aue 21E1 *

um desenvolvedor 'on-i.ure uma vez o ob8e$o de 'a'9e padro a ser usado para $odas as 'lasses de $abela.

Con!#%urando Zend_Db_?able_Abstract>>__construct<= < ?sso permi$e Aue um desenvolvedor 'on-i.ure o ob8e$o de 'a'9e a ser usado para uma ins$1n'ia de 'lasse de $abela par$i'ular.

=m ambos os 'asosM a espe'i-i'a>o do 'a'9e deve ser ou null (is$o KM sem uso de 'a'9e) ou uma ins$1n'ia de Zend_.ache_.ore. 5s mK$odos podem ser usados em 'on8un>o Auando K dese8vel $er $an$o um 'a'9e de me$ados padro e a 9abilidade de mudar o 'a'9e para ob8e$os de $abela individuais. Exemplo 10.100. Uando um Cac*e de 8etados (adr/o para todos os 5b'etos ?able 5 'Ldi.o se.uin$e demons$ra 'omo 'on-i.urar um 'a'9e de me$adados padro para ser usado para $odos os ob8e$os de $abelaP
<?php // Pri)eiro( con-i/ura o .ache require_once 'Zend/.ache.php'; $-rontend7ptions array" 'auto)atic_serialiEation' # true +; $bacXend7ptions array" 'cacheDir' # 'cacheDir' +; $cache Zend_.ache,,-actory"'.ore'( '6ile'( $-rontend7ptions( $bacXend7ptions+; // Depois( con-i/ura o cache a ser usado co) todos os ob1etos de tabela require_once 'Zend/Db/;able/Abstract.php'; Zend_Db_;able_Abstract,,setDe-aultMetadata.ache"$cache+; // =)a classe de tabela ta)bL) L necess\ria class Au/s e*tends Zend_Db_;able_Abstract C // ... D // .ada inst0ncia de Au/s usa a/ora o cache de )etadados padrFo $bu/s ne! Au/s"+;

Exemplo 10.101. Usando um Cac*e de 8etadados para um 5b'eto ?abele EspecK!#co 5 'Ldi.o se.uin$e demons$ra 'omo 'on-i.urar um 'a'9e de me$adados para uma ins$1n'ia espe'C-i'a de um ob8e$o $abelaP
<?php // Pri)eiro( con-i/ura o .ache require_once 'Zend/.ache.php'; $-rontend7ptions array" 'auto)atic_serialiEation' # true +; $bacXend7ptions array"

2*E1 *

'cacheDir' # 'cacheDir' +; $cache Zend_.ache,,-actory"'.ore'( '6ile'( $-rontend7ptions( $bacXend7ptions+; // =)a classe tabela ta)bL) L necess\ria require_once 'Zend/Db/;able/Abstract.php'; class Au/s e*tends Zend_Db_;able_Abstract C // ... D // .on-i/ura u)a inst0ncia )ediante instanciaYFo $bu/s ne! Au/s"array"')etadata.ache' # $cache++;

Aer#al#$a./o AutomMt#ca com o Cac*e Frontend )ma vez Aue a in-orma>o re$ornada do mK$odo des'ribeTable() do adap$ador K um ve$orM .aran$a Aue a op>o auto)atic_serialiEation se8a 'on-i.urada para true para o -ron$end Zend_.ache_.ore. =mbora o e3emplo a'ima use Zend_.ache_AacXend_6ileM desenvolvedores podem usar AualAuer ba'kend 'a'9e Aue se8a apropriado para a si$ua>o. 0or -avorM ve8a Zend!&a'9e para mais in-orma>4es.

10.-.12. Custom#$ando e Estendendo uma Classe ?able


10.-.12.1. Usando Classes :o+ ou :o+set Custom#$adas 0or padroM mK$odos da 'lasse Table re$ornam 'on8un$os de lin9as em ins$1n'ias da 'lasse 'on're$a Zend!"b!Table!7owse$M e um 'on8un$o de lin9as 'on$Om uma 'ole>o de ins$1n'ias da 'lasse 'on're$a Zend!"b!Table!7ow. ;o'O pode espe'i-i'ar 'lasses al$erna$ivas para usar Aue no se8am essasM mas ele deve uma 'lasse Aue es$enda Zend!"b!Table!7owse$!#bs$ra'$ e Zend!"b!Table!7ow!#bs$ra'$M respe'$ivamen$e. ;o'O pode espe'i-i'ar as 'lasses 7ow e 7owse$ usando o ve$or de op>4es do 'ons$ru$orM nas '9aves 'ro!.lass' e 'ro!set.lass' respe'$ivamen$e. =spe'i-iAue os nomes das 'lasses usando li$erais. Exemplo 10.102. Exemplo de espec#!#ca./o de classes :o+ e :o+set
<?php class My_<o! e*tends Zend_Db_;able_<o!_Abstract C ... D class My_<o!set e*tends Zend_Db_;able_<o!set_Abstract C ... D $table ne! Au/s" array" 'ro!.lass' # 'My_<o!'(

2,E1 *

'ro!set.lass'

# 'My_<o!set' ?'( '25>'+

+; $!here $table3#/etAdapter"+3#quote9nto"'bu/_status // <etorna u) ob1eto do tipo My_<o!set( // contendo u) Betor de ob1etos do tipo My_<o!. $ro!s $table3#-etchAll"$!here+;

;o'O pode al$erar as 'lasses espe'i-i'ando<as 'om os mK$odos set<o!.lass"+ e set<o!set.lass"+. ?sso se apli'a a lin9as e 'on8un$os de lin9as 'riados subseAWen$emen$eZ isso no al$era a 'lasse de AualAuer ob8e$o row ou rowse$ Aue vo'O $en9a 'riado previamen$e. Exemplo 10.10". Exemplo de altera./o de classes :o+ e :o+set
<?php $table ne! Au/s"+; $!here $table3#/etAdapter"+3#quote9nto"'bu/_status ?'( '25>'+ // <etorna u) ob1eto do tipo Zend_Db_;able_<o!set // contendo u) Betor de ob1etos do tipo Zend_Db_;able_<o!. $ro!s4tandard $table3#-etchAll"$!here+; $table3#set<o!.lass"'My_<o!'+; $table3#set<o!set.lass"'My_<o!set'+; // <etorna u) ob1eto do tipo My_<o!set( // contendo u) Betor de ob1etos do tipo My_<o!. $ro!s.usto) $table3#-etchAll"$!here+; // 7 ob1eto $ro!s4tandard ainda e*iste( e ele L i)ut\Bel.

0ara mais in-orma>4es sobre as 'lasses 7ow e 7owse$M ve8a Se>o 1 ./M TZend!"b!Table!7owU e Se>o 1 .2M TZend!"b!Table!7owse$U. 10.-.12.2. De!#n#ndo 9R%#ca Custom#$ada para DnsertS Update e Delete ;o'O pode sobres'rever os mK$odos insert"+ e update"+ em suas 'lasses Table. ?sso d a vo'O a opor$unidade de implemen$ar 'Ldi.o 'us$omizado Aue K e3e'u$ado an$es da realiza>o da opera>o do ban'o de dados. &er$i-iAue<se de '9amar o mK$odo da 'lasse me Auando vo'O o -izer. Exemplo 10.10&. 9R%#ca custom#$ada para %erenc#ar t#mestamps
<?php class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s'; public -unction insert"array $data+ C // adiciona u)a ti)esta)p i- "e)pty"$dataM'created_on'N++ C $dataM'created_on'N ti)e"+;

2%E1 *

D return parent,,insert"$data+; D public -unction update"array $data( $!here+ C // adiciona u)a ti)esta)p i- "e)pty"$dataM'updated_on'N++ C $dataM'updated_on'N ti)e"+; D return parent,,update"$data( $!here+; D

;o'O $ambKm pode sobres'rever o mK$odo delete"+. 10.-.12.". De!#na 8 todos de Busca Custom#$ados em Zend_Db_?able ;o'O pode implemen$ar mK$odos de 'onsul$a 'us$omizados em suas 'lasses TableM se vo'O ne'essidade -reAWen$e de -azer 'onsul$as 'on$ra essa $abela 'om 'ri$Krios espe'C-i'os. # maioria das 'onsul$as pode ser es'ri$a usando -etchAll"+M mas isso reAuer Aue vo'O dupliAue 'Ldi.o para -ormar as 'ondi>4es da 'onsul$a se vo'O pre'isar rodar a 'onsul$a em diversos lu.ares de sua apli'a>o. 0or$an$o pode ser 'onvenien$e implemen$ar um mK$odo na 'lasse Table 'lass Aue e3e'u$e 'onsul$as usadas 'om -reAWen'ia 'on$ra a $abela. Exemplo 10.10-. 8 todo Custom#$ado para encontrar bu%s por status
<?php class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s'; public -unction -indAy4tatus"$status+ C $!here $this3#/etAdapter"+3#quote9nto"'bu/_status return $this3#-etchAll"$!here( 'bu/_id'+; D D

?'( $status+;

10.-.12.&. De!#na Dn!lect#on em Zend_Db_?able #l.umas pessoas pre-erem Aue o nome da 'lasse de $abela 'ase 'om um nome de $abela no 7"(:S a$ravKs do uso de uma $rans-orma>o li$eral '9amada inflection. 0or e3emploM se seu nome de 'lasse de $abela -or RAu/sProductsRM seria 'asado 'om a $abela -Csi'a no ban'o de dados '9amada Rbu/s_productsMR se vo'O omi$ir a de'lara>o e3plC'i$a da propriedade de 'lasse $_na)e. Besse mapeamen$o de in-le'$ionM o nome da 'lasse di.i$ado no 25E1 *

-orma$o R&amel&aseR seria $rans-ormado para 'ai3a bai3aM e as palavras seriam separadas 'om um unders'ore. ;o'O pode espe'i-i'ar o nome da $abela do ban'o de dados independen$emen$e do nome da 'lasse pela de'lara>o do nome da $abela 'om a propriedade de 'lasse $_na)e em 'ada uma de suas 'lasses de $abela. Zend!"b!Table!#bs$ra'$ no e3e'u$a in-le'$ion para mapear o nome de 'lasse para o nome de $abela. Se vo'O omi$ir a de'lara>o de $_na)e em sua 'lasse de $abelaM a 'lasse mapeia para uma $abela do ban'o de dados Aue 'asa 'om a di.i$a>o e3a$a do nome da 'lasse. X inapropriado $rans-ormar iden$i-i'adores do ban'o de dadosM porAue isso pode levar b ambi.Widade ou -azer al.uns iden$i-i'adores ina'essCveis. )sar os iden$i-i'adores SDL e3a$amen$e 'omo eles apare'em no ban'o de dados $orna Zend!"b!Table!#bs$ra'$ $an$o mais simples Auan$o mais -le3Cvel. Se vo'O pre-erir usar in-le'$ionM en$o vo'O deve implemen$ar a $rans-orma>o por 'on$a prLpriaM pela sobres'ri$a do mK$odo _setup;able2a)e"+ em suas 'lasses Table. )m modo de -azer isso K de-inir uma 'lasse abs$ra$a Aue es$enda Zend!"b!Table!#bs$ra'$M e en$o o res$o de suas $abelas es$ende sua nova 'lasse abs$ra$a. Exemplo 10.101. Exemplo de uma classe de tabela abstrata 2ue #mplementa #n!lect#on
<?php abstract class MyAbstract;able e*tends Zend_Db_;able_Abstract C protected -unction _setup;able2a)e"+ C i- "f$this3#_na)e+ C $this3#_na)e )y.usto)9n-lector"/et_class"$this++; D parent,,_setup;able2a)e"+; D D class Au/sProducts e*tends MyAbstract;able C D

;o'O K responsvel por es'rever as -un>4es Aue e3e'u$aro $rans-orma>o de in-le'$ion. Zend Framework no provO $al -un>o.

10.1. Zend_Db_?able_:o+
10.1.1. Dntrodu./o
Zend!"b!Table!7ow K uma 'lasse Aue 'on$Km um lin9a individual de um ob8e$o Zend!"b!Table. 2/E1 *

Duando vo'O roda uma 'onsul$a 'on$ra uma 'lasse TableM o resul$ado K re$ornado em um 'on8un$o de ob8e$os Zend!"b!Table!7ow. ;o'O pode $ambKm usar esse ob8e$o para 'riar novas lin9as e adi'ion<las 1 $abela do ban'o de dados. Zend!"b!Table!7ow K uma implemen$a>o do padro 7ow "a$a Ga$ewa+.

10.1.2. Buscando uma 9#n*a


Zend!"b!Table!#bs$ra'$ -orne'e os mK$odos -ind"+ e -etchAll"+M 'ada Aual re$ornando um ob8e$o do $ipo Zend!"b!Table!7owse$M e o mK$odo -etch<o!"+M Aue re$orna um ob8e$o do $ipo Zend!"b!Table!7ow. Exemplo 10.103. Exemplo de busca de uma l#n*a
<?php $bu/s $ro!

ne! Au/s"+; $bu/s3#-etch<o!"$bu/s3#select"+3#!here"'bu/_id

?'( $++;

)m ob8e$o Zend!"b!Table!7owse$ 'on$Km uma 'ole>o de ob8e$os Zend!"b!Table!7ow. ;e8a Se>o 1 .2M TZend!"b!Table!7owse$U. Exemplo 10.107. Exemplo de le#tura de uma l#n*a em um con'unto de l#n*as
<?php $bu/s ne! Au/s"+; $ro!set $bu/s3#-etchAll"$bu/s3#select"+3#!here"'bu/_status $ro! $ro!set3#current"+;

?'( $++;

10.1.2.1. 9endo ,alores de coluna de uma l#n*a Zend!"b!Table!7ow!#bs$ra'$ -orne'e mK$odos a'essores de modo Aue vo'O possa re-eren'iar 'olunas na lin9a 'omo propriedades de ob8e$o. Exemplo 10.10;. Exemplo de le#tura de uma coluna em uma l#n*a
<?php $bu/s ne! Au/s"+; $ro! $bu/s3#-etch<o!"$bu/s3#select"+3#!here"'bu/_id // 5cho the Balue o- the bu/_description colu)n echo $ro!3#bu/_description;

?'( $++;

22E1 *

Nota ;ers4es an$eriores de Zend!"b!Table!7ow mapeiam esses a'essores de 'oluna para nomes de 'oluna do ban'o de dados usando uma $rans-orma>o li$eral '9amada inflection. #$ualmen$eM Zend!"b!Table!7ow no implemen$a in-le'$ion. Bomes de propriedades a'essadas pre'isam 'asar a di.i$a>o dos nomes de 'oluna 'omo eles apare'em em seu ban'o de dados. 10.1.2.2. :ecuperando Dados de 9#n*a como um Cetor ;o'O pode a'essar os dados da lin9a 'omo um ve$or usando o mK$odo toArray"+ do ob8e$o 7ow. ?sso re$orna um ve$or asso'ia$ivo dos nomes de 'oluna para os valores de 'oluna. Exemplo 10.110. Exemplo de uso do m todo toArray<=
<?php $bu/s ne! Au/s"+; $ro! $bu/s3#-etch<o!"$bu/s3#select"+3#!here"'bu/_id ?'( $++; // 7btL) o Betor associatiBo coluna/Balor do ob1eto <o! $ro!Array $ro!3#toArray"+; // A/ora usa3o co)o u) Betor nor)al -oreach "$ro!Array as $colu)n # $Balue+ C echo T.olu)n, $colu)nUnT; echo TGalue, $BalueUnT; D

5 ve$or re$ornado de toArray"+ no K a$ualizvel. ;o'O pode modi-i'ar os valores no ve$or assim 'omo 'om AualAuer ve$orM mas vo'O no pode .ravar al$era>4es desse ve$or dire$amen$e para o ban'o de dados. 10.1.2.". Buscando dados de tabelas relac#onadas # 'lasse Zend!"b!Table!7ow!#bs$ra'$ -orne'e mK$odos para bus'ar lin9as e 'on8un$os de lin9as de $abelas rela'ionadas. ;e8a Se>o 1 .@M T7ela'ionamen$os Zend!"b!TableU para mais in-orma>4es sobre rela'ionamen$os de $abela.

10.1.". Escre,endo l#n*as em um banco de dados


10.1.".1. Alterando ,alores de coluna em uma l#n*a ;o'O pode 'on-i.urar valores de 'oluna individuais usando a'essores de 'olunaM de modo similar a 'omo as 'olunas so lidas 'omo propriedades de ob8e$o no e3emplo a'ima.

2@E1 *

)sando um a'essor de 'oluna para 'on-i.urar um valor al$era o valor da 'oluna do ob8e$o row em sua apli'a>oM mas no e-e$iva a mudan>a no ban'o de dados ainda. ;o'O pode -azer isso 'om o mK$odo saBe"+. Exemplo 10.111. Exemplo de altera./o de coluna em uma l#n*a
<?php $bu/s ne! Au/s"+; $ro! $bu/s3#-etch<o!"$bu/s3#select"+3#!here"'bu/_id ?'( $++; // Altera o Balor de u)a ou )ais colunas $ro!3#bu/_status '69S5D'; // AtualiEa a linha no banco de dados co) noBos Balores $ro!3#saBe"+;

10.1.".2. Dnclu#ndo uma no,a l#n*a ;o'O pode 'riar uma nova lin9a para uma $abela dada 'om o mK$odo create<o!"+ da 'lasse de $abela. ;o'O pode a'essar 'ampos dessa lin9a 'om a in$er-a'e orien$ada a ob8e$osM mas a lin9a no K armazenada no ban'o de dados a$K Aue vo'O '9ame o mK$odo saBe"+. Exemplo 10.112. Exemplo de cr#a./o de uma no,a l#n*a para a tabela
<?php $bu/s ne! Au/s"+; $ne!<o! $bu/s3#create<o!"+; // .on-i/ura Balores de coluna da -or)a apropriada para sua aplicaYFo $ne!<o!3#bu/_description '...description...'; $ne!<o!3#bu/_status '25>'; // 9nclui a noBa linha no banco de dados $ne!<o!3#saBe"+;

5 ar.umen$o op'ional para o mK$odo 'rea$e7ow() K um ve$or asso'ia$ivoM 'om o Aual vo'O popula 'ampos da nova lin9a. Exemplo 10.11". Exemplo de popula./o de uma no,a l#n*a para uma tabela
<?php $data array" 'bu/_description' # '...description...'( 'bu/_status' # '25>' +; $bu/s ne! Au/s"+; $ne!<o! $bu/s3#create<o!"$data+; // 9nclugr a noBa linha no banco de dados $ne!<o!3#saBe"+;

26E1 *

Nota 5 mK$odo create<o!"+ -oi '9amado -etch2e!"+ nos Nl$imos lan>amen$os de Zend!"b!Table. ;o'O K en'ora8ado a usar o novo nome do mK$odoM embora o nome an$i.o 'on$inue a -un'ionar por mo$ivos de 'ompa$ibilidade inversa. 10.1.".". Alterando ,alores em mPlt#plas colunas Zend!"b!Table!7ow!#bs$ra'$ -orne'e o mK$odo set6ro)Array"+ para 9abili$ar vo'O a 'on-i.urar diversas 'olunas em uma lin9a simples de uma Nni'a vezM espe'i-i'adas em um ve$or asso'ia$ivo Aue maperia os nomes de 'oluna para os valores. ;o'O pode a'9ar esse mK$odo 'onvenien$e para 'on-i.urar valores $an$o apra novas lin9as Auan$o para lin9as Aue vo'O pre'ise a$ualizar. Exemplo 10.11&. Exemplo de uso de setFromArray<= para con!#%urar ,alores em uma no,a l#n*a
<?php $bu/s ne! Au/s"+; $ne!<o! $bu/s3#create<o!"+; // Dados sFo rearran1ados e) u) Betor associatiBo $data array" 'bu/_description' # '...description...'( 'bu/_status' # '25>' +; // .on-i/ura todos os Balores de coluna de u)a BeE $ne!<o!3#set6ro)Array"$data+; // 9nclui a noBa linha no banco de dados $ne!<o!3#saBe"+;

10.1.".&. Apa%ando uma l#n*a ;o'O pode '9amar o mK$odo delete"+ sobre um ob8e$o 7ow. ?sso apa.a lin9as no ban'o de dados Aue 'asam 'om a '9ave primria no ob8e$o 7ow. Exemplo 10.11-. Exemplo de remo./o de uma l#n*a
<?php $bu/s ne! Au/s"+; $ro! $bu/s3#-etch<o!"'bu/_id // Apa/a essa linha $ro!3#delete"+;

$'+;

@ E1 *

;o'O no $em de '9amar saBe"+ para apli'ara a remo>oZ isso K e3e'u$ado 'on$ra o ban'o de dados imedia$amen$e.

10.1.&. Aer#al#$ando e desser#al#$ando l#n*as


X -reAWen$emen$e 'onvenien$e .ravar os 'on$eNdos de uma lin9a de ban'o de dados para serem usados mais $arde. Serializao K o nome para a opera>o Aue 'onver$e um ob8e$o em um -orma$o Aue K -'il de .ravar em um armazenamen$o o--line (por e3emploM um arAuivo). 5b8e$os do $ipoZend!"b!Table!7ow!#bs$ra'$ so serializveis. 10.1.&.1. Aer#al#$ando uma 9#n*a Simplesmen$e use a -un>o 0I0 serialiEe"+ para 'riar um li$eral 'on$endo uma represen$a>o linear do ar.umen$oM no 'asoM do ob8e$o 7ow. Exemplo 10.111. Exemplo de ser#al#$a./o de uma l#n*a
<?php $bu/s ne! Au/s"+; $ro! $bu/s3#-etch<o!"'bu/_id $'+; // .onBerte ob1eto para -or)a serialiEada $serialiEed<o! serialiEe"$ro!+; // A/ora BocR escreBe $serialiEed<o! para u) arquiBo( etc.

10.1.&.2. Desser#al#$ando Dados de 9#n*a )se a -un>o 0I0 unserialiEe"+ para res$aurar um $ipo s$rin. 'on$endo uma represen$a>o li$eral de um ob8e$o. # -un>o re$orna o ob8e$o ori.inal. Bo$e Aue o ob8e$o 7ow re$ornado es$ em um es$ado disconnected. ;o'O pode ler o ob8e$o 7ow e suas propriedadesM mas no pode mudar valores na lin9a ou e3e'u$ar ou$ros mK$odos Aue reAueiram um 'one3o 'om a base de dados (por e3emploM 'onsul$as 'on$ra $abelas rela'ionadas). Exemplo 10.113. Exemplo de desser#al#$a./o de uma l#n*a ser#al#$ada
<?php $ro!.lone unserialiEe"$serialiEed<o!+; // A/ora BocR pode usar propriedades do ob1eto( )as so)ente leitura echo $ro!.lone3#bu/_description;

(or 2ue ob'etos :o+ desser#al#$am em um estado desconectadoI )m ob8e$o serializado K um li$eral Aue K le.Cvel para AualAuer um Aue o possua. ?sso pode ser @1E1 *

um ris'o de se.uran>a para armazenar par1me$ros $ais 'omo 'on$as e sen9as de ban'o de dados em $e3$o puroM sem en'rip$a>o de $e3$o no li$eral serializado. ;o'O no dese8aria armazenar $ais dados para um arAuivo de $e3$o Aue no es$ pro$e.idoM ou envi<lo em um email ou ou$ro meio Aue K -a'ilmen$e lido por po$en'iais a$a'an$es. 5 lei$or do ob8e$o serializado no deveria ser 'apaz de us<lo para ob$er a'esso ao seu ban'o de dados sem 'on9e'er 'reden'iais vlidas. 10.1.&.". :eat#,ando uma 9#n*a como Dado At#,o ;o'O pode rea$ivar uma lin9a des'one'$adaM usando o mK$odo set;able"+. 5 ar.umen$o para esse mK$odo K um ob8e$o vlido do $ipo Zend!"b!Table!#bs$ra'$M o Aual vo'O 'ria. &riar um ob8e$o Table reAuer uma 'one3o a$iva para o ban'o de dadosM assim por meio de reasso'ia>o do ob8e$o Table 'om o 7owM o ob8e$o 7ow ob$Km a'esso ao ban'o de dados. SubseAWen$emen$eM vo'O al$era valores no ob8e$o 7ow e .rava as mudan>as no ban'o de dados. Exemplo 10.117. Exemplo de reat#,a./o de uma l#n*a
<?php $ro!.lone unserialiEe"$serialiEed<o!+; $bu/s ne! Au/s"+; // <econecta a linha h tabela( e // entFo a u)a cone*Fo de banco de dados atiBa $ro!.lone3#set;able"$bu/s+; // A/ora BocR pode -aEer )udanYas para a linha e /raB\3las $ro!.lone3#bu/_status '69S5D'; $ro!.lone3#saBe"+;

10.1.-. Estendendo a classe :o+


Zend!"b!Table!7ow K a 'lasse 'on're$a padro Aue es$ende Zend!"b!Table!7ow!#bs$ra'$. ;o'O pode de-inir sua prLpria 'lasse 'on're$a para ins$1n'ias de 7ow es$endendo Zend!"b!Table!7ow!#bs$ra'$. 0ara usar sua nova 'lasse 7ow para armazenar resul$ados de 'onsul$as de TableM espe'i-iAue a 'lasse 7ow 'us$omizada pelo nome ou no membro pro$e.ido $_ro!.lass de uma 'lasse TableM ou no ar.umen$o ve$or do 'ons$ru$or de um ob8e$o Table. Exemplo 10.11;. Espec#!#cando uma classe :o+ custom#$ada
<?php class My<o! e*tends Zend_Db_;able_<o!_Abstract C // ...custo)iEaYies D // 5speci-ique u)a <o! custo)iEada para ser usada co)o padrFo // e) todas as inst0ncias de u)a classe ;able. class Products e*tends Zend_Db_;able_Abstract C protected $_na)e 'products';

@*E1 *

protected $_ro!.lass 'My<o!'; D // 7u especi-ique u)a <o! custo)iEada para ser usada e) u)a // inst0ncia de u)a classe ;able. $bu/s ne! Au/s"array"'ro!.lass' # 'My<o!'++;

10.1.-.1. Dn#c#al#a./o de :o+ Se a lL.i'a espe'C-i'a da apli'a>o pre'isa ser ini'ializada Auando uma lin9a K 'ons$ruCdaM vo'O pode op$ar por mover suas $are-as para o mK$odo init"+M o Aual K '9amado depois Aue $odos os me$adados de lin9a $em sido pro'essados. X re'omendado usar o mK$odo __construct se vo'O no pre'isar al$erar os me$adados de AualAuer modo pro.ram$i'o. Exemplo 10.120. Exemplo de uso do m todo #n#t<=
<?php class MyApplication<o! e*tends Zend_Db_;able_<o!_Abstract C protected $_role; protected -unction init"+ C $this3#_role ne! My<ole.lass"+; D D

10.1.-.2. De!#n#ndo 9R%#ca Custom#$ada para DnsertS UpdateS e Delete em Zend_Db_?able_:o+ # 'lasse 7ow '9ama mK$odos pro$e.idos _insert"+M _update"+M e _delete"+ an$es de e3e'u$ar as opera>4es 'orresponden$es 9245<;M =PDA;5M e D585;5. ;o'O pode adi'ionar lL.i'a a esses mK$odos em sua sub'lasse 7ow 'us$omizada. Se vo'O pre'isar -azer lL.i'a 'us$omizada em uma $abela espe'C-i'aM e a lL.i'a 'us$omizada deva o'orrer para 'ada opera>o nessa $abelaM pode -azer mais sen$ido implemen$ar seu 'Ldi.o 'us$omizado nos mK$odos insert"+M update"+ e delete"+ de sua 'lasse Table. =n$re$an$oM al.umas vezes pode ser ne'essrio -azer lL.i'a 'us$omizada na 'lasse 7ow. #bai3o es$o al.uns e3emplos de 'asos onde pode -azer sen$ido implemen$ar lL.i'a 'us$omizada em uma 'lasse ao invKs de na 'lasse TableP Exemplo 10.121. Exemplo de uma lR%#ca custom#$ada em uma classe :o+ # lL.i'a 'us$omizada pode no ser apli'vel em $odos os 'assos de opera>4es na respe'$iva Table. ;o'O pode -orne'er lL.i'a 'us$omizada sobre demanda implemen$ando<a em uma 'lasse 7ow e @,E1 *

'riando uma ins$1n'ia da 'lasse Tabela 'om essa 'lasse 7ow 'us$omizada Aue -oi espe'i-i'ada. &aso 'on$rrioM a Table usar a 'lasse 7ow padro. ;o'O pre'isa de dados de opera>4es nessa $abela para .ravar a opera>o em um ob8e$o Zend!Lo.M mas somen$e se a 'on-i.ura>o da apli'a>o $iver 9abili$ado esse 'ompor$amen$o.
<?php class My8o//in/<o! e*tends Zend_Db_;able_<o!_Abstract C protected -unction _insert"+ C $lo/ Zend_<e/istry,,/et"'database_lo/'+; $lo/3#in-o"Zend_Debu/,,du)p"$this3#_data( T9245<;, $this3#_table.lassT( -alse++; D D // $lo//in/5nabled L u) e*e)plo de propriedade que depende // da con-i/uraYFo de sua aplicaYFo i- "$lo//in/5nabled+ C $bu/s ne! Au/s"array"'ro!.lass' # 'My8o//in/<o!'++; D else C $bu/s ne! Au/s"+; D

Exemplo 10.122. Exemplo de uma classe :o+ 2ue e!etua lo% de dados de #nclus/o para mPlt#plas tabelas # lL.i'a 'us$omizada pode ser 'omum para mNl$iplas $abelas. #o invKs de implemen$ar a mesma lL.i'a 'us$omizada para 'ada uma de suas 'lasses TableM vo'O pode implemen$ar o 'Ldi.o para $ais a>4es na de-ini>o de uma 'lasse 7owM e usar essa 'lasse 7ow em 'ada uma de suas 'lasses Table. Besse e3emploM o 'Ldi.o de lo..in. K idOn$i'o em $odas as 'lasses de $abela.
<?php class My8o//in/<o! e*tends Zend_Db_;able_<o!_Abstract C protected -unction _insert"+ C $lo/ Zend_<e/istry,,/et"'database_lo/'+; $lo/3#in-o"Zend_Debu/,,du)p"$this3#_data( T9245<;, $this3#_table.lassT( -alse++; D D class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s'; protected $_ro!.lass 'My8o//in/<o!'; D class Products e*tends Zend_Db_;able_Abstract C protected $_na)e 'products'; protected $_ro!.lass 'My8o//in/<o!';

@%E1 *

10.1.-.". De!#na Dn!lect#on em Zend_Db_?able_:o+ #l.umas pessoas pre-erem Aue o nome da 'lasse de $abela 'ase 'om o nome de $abela no 7"(:S pelo uso de uma $rans-orma>o li$eral '9amada inflection. &lasses Zend!"b no implemen$am in-le'$ion por padro. ;e8a Se>o 1 .5.1*.%M T"e-ina ?n-le'$ion em Zend!"b!TableU para uma e3pli'a>o dessa dire$riz. Se vo'O pre-erir usar in-le'$ionM en$o deve implemen$ar a $rans-orma>o por sua 'on$aM pela sobres'ri$a do mK$odo _trans-or).olu)n"+ em uma 'lasse 'us$omizada 7owM e usar essa 'lasse 7ow 'us$omizada Auando vo'O e3e'u$ar 'onsul$as 'on$ra sua 'lasse Table. Exemplo 10.12". Exemplo de de!#n#./o de uma trans!orma./o #n!lect#on ?sso permi$e Aue vo'O use uma verso Tin-le'$edU do nome da 'oluna nos a'essores. # 'lasse 7ow usa o mK$odo _trans-or).olu)n"+ para al$erar o nome Aue vo'O usa para o nome da 'oluna na$ivo na $abela do ban'o de dados.
<?php class My9n-lected<o! e*tends Zend_Db_;able_<o!_Abstract C protected -unction _trans-or).olu)n"$colu)n2a)e+ C $natiBe.olu)n2a)e )y.usto)9n-lector"$colu)n2a)e+; return $natiBe.olu)n2a)e; D D class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s'; protected $_ro!.lass 'My9n-lected<o!'; D $bu/s ne! Au/s"+; $ro! $bu/s3#-etch2e!"+; // =se no)es de coluna ca)elcase( e con-ie na // -unYFo de trans-or)aYFo para alter\3lo para a // representaYFo natiBa. $ro!3#bu/Description '2e! description';

;o'O K responsvel por es'rever as -un>4es para e3e'u$ar $rans-orma>o de in-le'$ion. Zend Framework no -orne'e $ais -un>4es.

@5E1 *

10.3. Zend_Db_?able_:o+set
10.3.1. Dntrodu./o
Duando vo'O roda uma 'onsul$a 'on$ra uma 'lasse Table usando os mK$odos -ind"+ ou -etchAll"+M o resul$ado K re$ornado em um ob8e$o do $ipo Zend_Db_;able_<o!set_Abstract. )m 7owse$ 'on$Km uma 'ole>o de ob8e$os des'enden$es de Zend_Db_;able_<o!_Abstract. ;o'O pode i$erar a$ravKs do 7owse$ e a'essar ob8e$os 7ow individualmen$eM lendo ou modi-i'ando dados nos 7ows.

10.3.2. Buscando um :o+set


Zend_Db_;able_Abstract -orne'e os mK$odos -ind"+ e -etchAll"+M 'ada um dos Auais re$orna um ob8e$o do $ipo Zend_Db_;able_<o!set_Abstract. Exemplo 10.12&. Exemplo de busca de um con'unto de l#n*as
<?php $bu/s $ro!set

ne! Au/s"+; $bu/s3#-etchAll"Tbu/_status

'25>'T+;

10.3.". :ecuperando 9#n*as de um Con'unto de 9#n*as


5 ob8e$o 7owse$ por si prLprio K .eralmen$e menos in$eressan$e do Aue os ob8e$os 7ows Aue ele 'on$Km. =s$a se>o ilus$ra 'omo ob$er 7ows Aue 'ompreendem o 7owse$. )ma 'onsul$a le.C$ima re$orna zero lin9as Auando nen9uma lin9a no ban'o de ados 'asa 'om as 'ondi>4es de 'onsul$a. 0or$an$o uma ob8e$o 7owse$ podem 'on$er zero ob8e$os 7ow. )ma vez Aue Zend_Db_;able_<o!set_Abstract implemen$a a in$er-a'e .ountableM vo'O pode usar count"+ para de$erminar o nNmero de 7ows no 7owse$. Exemplo 10.12-. Contando :o+s em um :o+set
<?php $ro!set $bu/s3#-etchAll"Tbu/_status $ro!.ount count"$ro!set+; i- "$ro!.ount # '+ C echo T-ound $ro!.ount ro!sT; D else C echo 'no ro!s )atched the query'; D

'69S5D'T+;

@/E1 *

Exemplo 10.121. 9endo um ob'eto :o+ s#mples de um :o+set 5 modo mais simples de a'essar um ob8e$o 7ow de um 7owse$ K usar o mK$odo current"+. ?sso K par$i'ularmen$e apropriado Auando o 7owse$ 'on$Km e3a$amen$e um ob8e$o 7ow.
<?php $bu/s $ro!set $ro!

ne! Au/s"+; $bu/s3#-etchAll"Tbu/_id $ro!set3#current"+;

$T+;

Se o 7owse$ 'on$Km zero lin9asM current"+ re$orna o valor 0I0 null. Exemplo 10.123. Dterando atra,pes de um :o+set 5b8e$os des'enden$es de Zend_Db_;able_<o!set_Abstract implemen$am a in$er-a'e 4eeXable9teratorM e Aue si.ni-i'a Aue vo'O pode i$erar a$ravKs deles usando a 'ons$ru>o -oreach. &ada valor Aue vo'O re'uperar desse modo K um ob8e$o Zend_Db_;able_<o!_Abstract Aue 'orresponde a um re.is$ro da $abela.
<?php $bu/s ne! Au/s"+; // busca todos os re/istros da tabela $ro!set $bu/s3#-etchAll"+; -oreach "$ro!set as $ro!+ C // e*ibe 'Zend_Db_;able_<o!' ou si)ilar echo /et_class"$ro!+ . TUnT; // lR u)a coluna na linha $status $ro!3#bu/_status; // )odi-ica u)a coluna na linha atual $ro!3#assi/ned_to '))ouse'; // /raBa a )udanYa no banco de dados $ro!3#saBe"+; D

Exemplo 10.127. (rocurando uma pos#./o con*ec#da em um ob'eto :o+set 4eeXable9terator permi$e Aue vo'O pro'ure por uma posi>o para a Aual vo'O .os$aria Aue o i$erador sal$asse. Simplesmen$e use o mK$odo seeX"+ para isso. 0asse um in$eiro represen$ando o nNmero do ob8e$o 7ow Aue vo'O .os$aria Aue seu 7owse$ apon$asse 'omo prL3imoM no esAue>a Aue o Cndi'e 'ome>a em . Se o Cndi'e es$iver erradoM Auer dizerM no e3is$eM uma e3'e>o ser lan>ada. ;o'O deve usar count"+ para veri-i'ar o nNmero de resul$ados an$es de pro'urar por uma posi>o.

@2E1 *

<?php $bu/s ne! Au/s"+; // busca todos os re/istros da tabela $ro!set $bu/s3#-etchAll"+; // leBa o iterador para o nono ele)ento "Eero L u) ele)ento+ , $ro!set3#seeX"]+; // recupera3o $ro!b $ro!set3#current"+; // e usa3o $ro!b3#assi/ned_to '))ouse'; $ro!b3#saBe"+; D

/et<o!"+ permi$e Aue vo'O ob$en9a uma lin9a espe'C-i'a do ob8e$o 7owse$M sabendo sua posi>oZ no esAue>a en$re$an$o Aue as posi>4es 'ome>am 'om Cndi'e zero. 5 primeiro par1me$ro para /et<o!"+ K um in$eiro para a posi>o pedida. 5 se.undo par1me$ro op'ional K um booleanoZ ele diz ao i$erador 7owse$ se deve pro'urar essa posi>o na mesma 9oraM ou no (o padro K -alse). =sse mK$odo re$orna um ob8e$o Zend!"b!Table!7ow por padro. Se a posi>o reAuerida no e3is$irM uma e3'e>o ser lan>ada. #Aui es$ um e3emploP
<?php $bu/s ne! Au/s"+; // busca todos os re/istros da tabela $ro!set $bu/s3#-etchAll"+; // recupera o nono ele)ento i)ediata)ente , $ro!b3#/et<o!"]+; // e usa3o , $ro!b3#assi/ned_to '))ouse'; $ro!b3#saBe"+; D

"epois Aue vo'O $en9a a'essado um ob8e$o 7ow individualmen$eM vo'O pode manipular o ob8e$o usando os mK$odos des'ri$os na Se>o 1 ./M TZend!"b!Table!7owU.

10.3.&. :ecuperando um ob'eto :o+set como um Cetor


;o'O pode a'essar $odos os dados no ob8e$o 7owse$ 'omo um ve$or usando o mK$odo toArray"+ do ob8e$o 7owse$. =le re$orna um ve$or 'on$endo uma en$rada por lin9a. &ada en$rada K um ve$or asso'ia$ivo 'om '9aves Aue 'orrespondem a nomes de 'oluna e elemen$os Aue 'orrespondem aos respe'$ivos valores de 'oluna. Exemplo 10.12;. Usando toArray<=
<?php $bu/s ne! Au/s"+; $ro!set $bu/s3#-etchAll"+; $ro!setArray $ro!set3#toArray"+;

@@E1 *

$ro!.ount $; -oreach "$ro!setArray as $ro!Array+ C echo Tro! j$ro!.ount,UnT; -oreach "$ro!Array as $colu)n # $Balue+ C echo TUt$colu)n # $BalueUnT; D ``$ro!.ount; echo TUnT; D

5 ve$or re$ornado por toArray"+ no K a$ualizvel. ?s$o KM vo'O pode modi-i'ar os valores no ve$or 'omo -az 'om AualAuer ve$orM mas as mudan>as no ve$or no sero propa.adas para o ban'o de dados.

10.3.-. Aer#al#$ando e Desser#al#$ando um ob'eto :o+set


5b8e$os do $ipo Zend_Db_;able_<o!set_Abstract so serializKveis. =m um modo similar a serializar um ob8e$o 7ow individualM vo'O pode serializar um ob8e$o 7owse$ e desserializ<lo mais $arde. Exemplo 10.1"0. Aer#al#$ando um ob'eto :o+set Simplesmen$e use a -un>o 0I0 serialiEe"+ para 'riar um li$eral 'on$endo uma represen$a>o li$eral do ar.umen$oM o ob8e$o 7owse$.
<?php $bu/s ne! Au/s"+; $ro!set $bu/s3#-etchAll"+; // .onBerte ob1eto para u) -or)ato serialiEado $serialiEed<o!set serialiEe"$ro!set+; // A/ora BocR pode /raBar $serialiEed<o!set e) u) arquiBo( etc.

Exemplo 10.1"1. Desser#al#$ando um ob'eto :o+set Aer#al#$ado )se a -un>o 0I0 unserialiEe"+ para res$aurar um li$eral 'on$endo uma represen$a>o li$eral de um ob8e$o. # -un>o re$orna o ob8e$o ori.inal. Bo$e Aue o ob8e$o 7owse$ re$ornado es$ em um es$ado disconnected. ;o'O pode i$erar a$ravKs do ob8e$o 7owse$ e ler os ob8e$os 7ow e suas propriedadesM mas vo'O no pode al$erar os valores nos ob8e$os 7ows ou e3e'u$ar ou$ros mK$odos Aue reAueiram uma 'one3o 'om o ban'o de dados (por e3emploM 'onsul$as 'on$ra $abelas rela'ionadas).
<?php $ro!setDisconnected unserialiEe"$serialiEed<o!set+; // A/ora BocR pode usar )Ltodos e propriedade do ob1eto( )as so)ente leitura

@6E1 *

$ro! $ro!setDisconnected3#current"+; echo $ro!3#bu/_description;

(or 2ue :o+sets desser#al#$a em um estado desconectadoI )m o8e$o serializado K um li$eral Aue K le.Cvel para AualAuer um Aue o possuir. ?sso pode ser um ris'o de se.uran>a para armazenar par1me$ros $ais 'omo 'on$a e sen9a de ban'o de dados em $e3$o puro e sem en'rip$a>o no li$eral serializado. ;o'O no iria Auerer armazenar dados em um arAuivo de $e3$o Aue no es$ pro$e.idoM ou enviar um e<mail ou ou$ro meio Aue K -a'ilmen$e lido por po$en'iais a$a'an$es. 5 lei$or do ob8e$o serializado no deve ser 'apaz de us<lo para ob$er a'esso ao seu ban'o de dados sem 'on9e'er 'reden'iais vlidas. ;o'O pode rea$ivar um ob8e$o 7owse$ des'one'$ado usando o mK$odo set;able"+. 5 ar.umen$o para esse mK$odo K um ob8e$o vlido do $ipo Zend_Db_;able_AbstractM Aue vo'O 'ria. &riar um ob8e$o Table reAuer uma 'one3o a$iva ao ban'o de dadosM assim pela reasso'ia>o do ob8e$o Table 'om o 7owse$M o 7owse$ ob$Km a'esso ao ban'o de dados. SubseAWen$emen$eM vo'O pode al$erar valores nos ob8e$os 7ow 'on$idos no 7owse$ e .ravar as mudan>as no ban'o de dados. Exemplo 10.1"2. :eat#,ando um ob'eto :o+set como Dado At#,o
<?php $ro!set unserialiEe"$serialiEed<o!set+; $bu/s ne! Au/s"+; // <econecta o con1unto de linhas para u)a tabela( e // entFo para u)a cone*Fo de banco de dados atiBa $ro!set3#set;able"$bu/s+; $ro! $ro!set3#current"+; // A/ora BocR pode -aEer alteraYies na linha e /raB\3las $ro!3#bu/_status '69S5D'; $ro!3#saBe"+;

7ea$ivar um ob8e$o 7owse$ 'om set;able"+ $ambKm rea$iva $odos os ob8e$os 7ow 'on$idos nele.

10.3.1. Estendendo a classe :o+set


;o'O pode usar uma 'lasse 'on're$a al$erna$iva para ins$1n'ias de 7owse$s es$endendo Zend!"b!Table!7owse$!#bs$ra'$. =spe'i-iAue a 'lasse 7owse$ 'us$omizada por nome ou no membro pro$e.ido $_ro!set.lass de uma 'lasse TableM ou no ar.umen$o ve$or da 'ons$ru>o de um ob8e$o Table. Exemplo 10.1"". Espec#!#cando uma classe :o+set custom#$ada
<?php class My<o!set e*tends Zend_Db_;able_<o!set_Abstract C

6 E1 *

// ...custo)iEaYies D // 5speci-ique u)a classe <o!set custo)iEada para ser usada co)o padrFo // e) todas as inst0ncias de u)a classe ;able. class Products e*tends Zend_Db_;able_Abstract C protected $_na)e 'products'; protected $_ro!set.lass 'My<o!set'; D // 7u especi-ique u)a classe <o!set custo)iEada para ser usada e) // u)a inst0ncia da classe ;able. $bu/s ne! Au/s"array"'ro!set.lass' # 'My<o!set'++;

Tipi'amen$eM a 'lasse 'on're$a padro Zend!"b!7owse$ K su-i'ien$e para a maioria dos usos. =n$re$an$oM vo'O pode a'9ar N$il adi'ionar nova lL.i'a a um 7owse$M espe'i-C'a para uma $abela da . 0or e3emploM um novo mK$odo poderia 'al'ular um a.re.ado sobre $odos os ob8e$os 7ows no 7owse$. Exemplo 10.1"&. Exemplo de classe :o+set class com um no,o m todo
<?php class MyAu/s<o!set e*tends Zend_Db_;able_<o!set_Abstract C /JJ J 5ncontre o ob1eto <o! no <o!set atual co) o J )aior Balor e) sua coluna 'updated_at'. J/ public -unction /et8atest=pdated<o!"+ C $)a*_updated_at '; $latest<o! null; -oreach "$this as $ro!+ C i- "$ro!3#updated_at # $)a*_updated_at+ C $latest<o! $ro!; D D return $latest<o!; D D class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s'; protected $_ro!set.lass 'MyAu/s<o!set'; D

10.7. :elac#onamentos Zend_Db_?able


10.7.1. Dntrodu./o
Tabelas $em rela'ionamen$os umas 'om as ou$ros em um ban'o de dados rela'ional. )ma en$idade 61E1 *

em uma $abela pode ser li.ada a uma ou mais en$idades em ou$ra $abela pelo uso de res$ri>4es de in$e.ridade re-eren'ial de-inidas no esAuema do ban'o de dados. # 'lasse Zend!"b!Table!7ow $em mK$odos para 'onsul$ar lin9as rela'ionadas em ou$ras $abelas.

10.7.2. De!#n#ndo :elac#onamentos


"e-ina 'lasse para uma de suas $abelasM es$endendo a 'lasse abs$ra$a Zend!"b!Table!#bs$ra'$M 'omo des'ri$o em Se>o 1 .5.*M T"e-inindo uma &lasse TableU. TambKm ve8a Se>o 1 .1.*M T5 ban'o de dados de e3empoU para uma des'ri>o do e3emplo do ban'o de dados para o Aual o 'Ldi.o de e3emplo -oi pro8e$ado. #bai3oM es$o as de-ini>4es de 'lasse 0I0 para essas $abelasP
<?php class Accounts e*tends Zend_Db_;able_Abstract C protected $_na)e 'accounts'; protected $_dependent;ables array"'Au/s'+; D class Products e*tends Zend_Db_;able_Abstract C protected $_na)e 'products'; protected $_dependent;ables array"'Au/sProducts'+; D class Au/s e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s'; protected $_dependent;ables array"'Au/sProducts'+; protected $_re-erenceMap array" '<eporter' # array" 'colu)ns' # 'reported_by'( 're-;able.lass' # 'Accounts'( 're-.olu)ns' # 'account_na)e' +( '5n/ineer' # array" 'colu)ns' # 'assi/ned_to'( 're-;able.lass' # 'Accounts'( 're-.olu)ns' # 'account_na)e' +( 'Geri-ier' # array" 'colu)ns' # array"'Beri-ied_by'+( 're-;able.lass' # 'Accounts'( 're-.olu)ns' # array"'account_na)e'+ + +; D class Au/sProducts e*tends Zend_Db_;able_Abstract C protected $_na)e 'bu/s_products'; protected $_re-erenceMap array" 'Au/' # array" 'colu)ns' # array"'bu/_id'+( 're-;able.lass' # 'Au/s'( 're-.olu)ns' # array"'bu/_id'+ +(

6*E1 *

+; D

'Product' # array" 'colu)ns' 're-;able.lass' 're-.olu)ns' +

# array"'product_id'+( # 'Products'( # array"'product_id'+

Se vo'O usar Zend!"b!Table para emular opera>4es )0"#T= e "=L=T= em 'as'a$aM de'lare o ve$or $_dependent;ables na 'lasse para a $abela me. Lis$e o nome da 'lasse para 'ada $abela dependen$e. )se o nome da 'lasseM no o nome -Csi'o da $abela SDL. Nota 0ule a de'lara>o de $_dependent;ables se vo'O usar res$ri>4es de in$e.ridade re-eren'ial no servidor 7"(:S para implemen$ar opera>4es de 'as'a$a. ;e8a Se>on 1 .@./M T5pera>4es de =s'ri$a em &as'a$aU para mais in-orma>4es. "e'lare o ve$or $_re-erenceMap na 'lasse para 'ada $abela dependen$e. =sse K um ve$or asso'ia$ivo de Tre.rasU de re-erOn'ia. )m re.ra de re-erOn'ia iden$i-i'a Aual $abela K a $abela me no rela'ionamen$oM e $ambKm lis$a Auais 'olunas na $abela dependen$e re-eren'iam Auais 'olunas na $abela me. # '9ave re.ra K um li$eral usado 'omo um Cndi'e para o ve$or $_re-erenceMap. =ssa '9ave re.ra K usada para iden$i-i'ar 'ada re-erOn'ia de rela'ionamen$o. =s'ol9a um nome des'ri$ivo para essa '9ave re.ra. X mel9or usar um li$eral Aue pode ser par$e de um nome de mK$odoM 'omo vo'O ver mais $arde. Bo e3emplo de 'Ldi.o 0I0 abai3oM as '9aves re.ra na $abela (u.s soP '<eporter'M '5n/ineer'M 'Geri-ier'M e 'Product'. 5 valor de 'ada en$rada rule no ve$or $_re-erenceMap $ambKm K um ve$or asso'ia$ivo. 5s elemen$os dessa en$rada de re.ra so des'ri$os abai3oP

columns `a )m li$eral ou um ve$or de li$erais de-inindo o(s) nome(s) de 'oluna de '9ave es$ran.eira na $abela dependen$e. X 'omum Aue se8a uma 'oluna simplesM mas al.umas $abelas $em '9aves mul$i'oluna.

re!?ableClass `a 5 nome da 'lasse da $abela me. )se o nome da 'lasseM no o nome -Csi'o da $abela SDL. X 'omum para uma $abela dependen$e $er somen$e uma re-erOn'ia para sua $abela meM mas al.umas $abelas $em mNl$iplas re-erOn'ias para a mesma $abela me. Bo ban'o de dados de e3emploM 9 uma re-erOn'ia da $abela bu/s para a $abela productsM mas $rOs re-erOn'ias da $abela bu/s para a $abela accounts. &oloAue 'ada re-erOn'ia em uma en$rada separada no ve$or $_re-erenceMap.

re!Columns `a )m li$eral ou um ve$or de li$erais de-inindo o(s) nome(s) de 'oluna de '9ave primcria na $abela me. 6,E1 *

X 'omum Aue se8a uma 'oluna simplesM mas al.umas $abelas $em '9aves mul$i'oluna. Se a re-erOn'ia usar uma '9ave mul$i'olunaM a ordem de 'olunas na en$rada 'colu)ns' deve 'asar 'om a ordem de 'olunas na en$rada 're-.olu)ns'. X op'ional espe'i-i'ar esse elemen$o. Se vo'O no espe'i-i'ar re-.olu)nsM a(s) 'oluna(s) repor$ada(s) 'omo 'olunas de '9ave primria da $abela me so usadas por padro.

onDelete `a # re.ra para uma a>o ser e3e'u$ada se uma lin9a -or apa.ada na $abela me. ;e8a Se>o 1 .@./M T5pera>4es de =s'ri$a em &as'a$aU para mais in-orma>4es. onUpdate `a # re.ra para uma a>o ser e3e'u$ada se valores nas 'olunas de '9ave primria so a$ualizados na $abela me. ;e8a Se>o 1 .@./M T5pera>4es de =s'ri$a em &as'a$aU para mais in-orma>4es.

10.7.". Buscando um ob'eto :o+set Dependente


Se vo'O $iver um ob8e$o 7ow 'omo o resul$ado de uma 'onsul$a sobre uma $abela meM vo'O pode bus'ar lin9as de $abelas dependen$es Aue re-eren'iam a lin9a a$ual. )se o mK$odoP
< $ro!3#-indDependent<o!set"$table( M$ruleN+;

=sse mK$odo re$orna um ob8e$o Zend!"b!Table!7owse$!#bs$ra'$M 'on$endo um 'on8un$o de lin9as da $abela dependen$e $table Aue re-eren'ie a lin9a iden$i-i'ada pelo ob8e$o $ro!. 5 primeiro ar.umen$o $table pode ser um li$eral Aue espe'i-i'a a $abela dependen$e por seu nome de 'lasse. ;o'O $ambKm pode espe'i-i'ar a $abela dependen$e pelo uso de um ob8e$o da 'lasse de $abela. Exemplo 10.1"-. Buscando um ob'eto :o+set Dependente =sse e3empo mos$ra a ob$en>o de um ob8e$o 7ow da $abela AccountsM e pro'ura o Au/s repor$ado por essa 'on$a.
<?php $accounts;able $accounts<o!set $user$%OV $bu/s<eportedAy=ser

ne! Accounts"+; $accounts;able3#-ind"$%OV+; $accounts<o!set3#current"+; $user$%OV3#-indDependent<o!set"'Au/s'+;

5 se.undo ar.umen$o $rule K op'ional. X um li$eral Aue nomeia a '9ave re.ra no ve$or $_re-erenceMap da 'lasse de $abela dependen$e. Se vo'O no espe'i-i'a uma re.raM a primeira re.ra no ve$or Aue re-eren'ia a $abela me K usada. Se vo'O pre'isar usar uma re.ra ou$ra Aue no a primeiraM vo'O pre'isa espe'i-i'ar a '9ave.

6%E1 *

Bo e3emplo de 'Ldi.o a'imaM a '9ave re.ra no -oi espe'i-i'adaM assim a re.ra usada por padro K a primeira Aue 'asa 'om a $abela me. =ssa K a re.ra '<eporter'. Exemplo 10.1"1. Buscando um ob'eto :o+set Dependente por uma :e%ra EspecK!#ca =sse e3emplo mos$ra a ob$en>o de um ob8e$o 7ow da $abela AccountsM e pro'ura o Au/s asso'iado para ser 'orri.ido pelo usurio dessa 'on$a. # '9ave re.ra Aue 'orresponde a essa re-erOn'ia de rela'ionamen$o nesse e3emplo K '5n/ineer'.
<?php $accounts;able $accounts<o!set $user$%OV $bu/sAssi/ned;o=ser

ne! Accounts"+; $accounts;able3#-ind"$%OV+; $accounts<o!set3#current"+; $user$%OV3#-indDependent<o!set"'Au/s'( '5n/ineer'+;

;o'O pode $ambKm adi'ionar 'ri$KriosM ordenando e limi$ando para Aue seus rela'ionamen$os usem o ob8e$o sele'ionado da lin9a me. Exemplo 10.1"3. Buscando um ob'eto :o+set Dependente usando um Zend_Db_?able_Aelect =sse e3emplo mos$ra a ob$en>o de um ob8e$o 7ow da $abela AccountsM e pro'ura o Au/s asso'iado para ser 'orri.ido pelo usurio dessa 'on$aM limi$ado somen$e a , lin9as e ordenado por nome.
<?php $accounts;able $accounts<o!set $user$%OV $select $bu/sAssi/ned;o=ser t+;

ne! Accounts"+; $accounts;able3#-ind"$%OV+; $accounts<o!set3#current"+; $accounts;able3#select"+3#order"'na)e A4.'+ 3#li)it"O+; $user$%OV3#-indDependent<o!set"'Au/s'( '5n/ineer'( $selec

#l$erna$ivamen$eM vo'O pode 'onsul$ar lin9as de uma $abela dependen$e usando um me'anismo espe'ial '9amado RmK$odo m.i'oR. Zend!"b!Table!7ow!#bs$ra'$ invo'a o mK$odoP -indDependent<o!set"'<;able.lass#'( '<<ule#'+ se vo'O invo'a um mK$odo no ob8e$o 7ow Aue 'ase 'om um dos se.uin$es padr4esP

$ro!3#-ind<;able.lass#"+ $ro!3#-ind<;able.lass#Ay<<ule#"+

Bos padr4es a'imaM <;able.lass# e <<ule# so li$erais Aue 'orrespondem ao nome da 'lasse da $abela dependen$eM e F '9ave de re.ra da $abela dependen$e Aue re-eren'ia a $abela me.

65E1 *

Nota #l.uns -rameworks de apli'a>oM $ais 'omo 7ub+ on 7ailsM usam um me'anismo '9amado Rin-le'$ionR para permi$ir a di.i$a>o de iden$i-i'adores de al$era>o dependendo do uso. 0or simpli'idadeM Zend!"b!Table!7ow no -orne'e AualAuer me'anismo de in-le'$ion. # iden$idade da $abela e a '9ave de re.ra nomeada na '9amada de mK$odo devem 'asar e3a$amen$e 'om a di.i$a>o da 'lasse e '9ave de re.ra. Exemplo 10.1"7. Buscando :o+sets Dependentes usando o 8 todo 8M%#co =sse e3emplo mos$ra a bus'a de 7owse$s dependen$es eAuivalen$es a esses nos e3emplos an$eriores. Besse 'asoM a apli'a>o usa a invo'a>o do mK$odo m.i'o ao invKs de espe'i-i'ar a $abela e re.ra 'omo li$erais.
<?php $accounts;able ne! Accounts"+; $accounts<o!set $accounts;able3#-ind"$%OV+; $user$%OV $accounts<o!set3#current"+; // =sa a re/ra de re-erRncia padrFo $bu/s<eportedAy $user$%OV3#-indAu/s"+; // 5speci-ica a re/ra de re-erRncia $bu/sAssi/ned;o $user$%OV3#-indAu/sAy5n/ineer"+;

10.7.&. Buscando uma 9#n*a 8/e


Se vo'O $em um ob8e$o 7ow 'omo resul$ado de uma 'onsul$a sobre uma $abela dependen$eM vo'O pode bus'ar a lin9a na me para a Aual a dependen$e se re-ere. )se o mK$odoP
< $ro!3#-indParent<o!"$table( M$ruleN+;

"eve sempre 9aver e3a$amen$e uma lin9a na $abela me re-eren'iada por uma lin9a dependen$eM por$an$o esse mK$odo re$orna um ob8e$o 7owM no um ob8e$o 7owse$. 5 primeiro ar.umen$o $table pode ser um li$eral Aue espe'i-i'a a $abela me por seu nome de 'lasse. ;o'O $ambKm pode espe'i-i'ar a $abela me pelo uso de um ob8e$o dessa 'lasse de $abela. Exemplo 10.1";. Buscando a 9#n*a 8/e =sse e3emplo mos$ra a ob$en>o de um ob8e$o 7ow da $abela Au/s (por e3emplo um desses bu.s 'om s$a$us QB=HQ)M e a bus'a da lin9a na $abela Accounts para o usurio Aue repor$ou o bu..
<?php $bu/s;able $bu/s<o!set $bu/$ $reporter

ne! Au/s"+; $bu/s;able3#-etchAll"array"'bu/_status $bu/s<o!set3#current"+; $bu/$3#-indParent<o!"'Accounts'+;

?'

# '25>'++;

6/E1 *

5 se.undo ar.umen$o $rule K op'ional. X um li$eral Aue nomeia a '9ave de re.ra no ve$or $_re-erenceMap da 'lasse de $abela dependen$e. Se vo'O no espe'i-i'ar uma re.raM a primeira re.ra no ve$or Aue re-eren'iar a $abela me ser usada. Se vo'O pre'isar usar uma re.ra ou$ra Aue no a primeiraM vo'O pre'isa espe'i-i'ar a '9ave. Bo e3emplo a'imaM a '9ave de re.ra no -oi espe'i-i'adaM assim a re.ra usada por padro K a primeria Aue 'asa 'om a $abela me. =ssa K a re.ra '<eporter'. Exemplo 10.1&0. Buscando uma 9#n*a 8/e por uma :e%ra EspecK!#ca =sse e3emplo mos$ra a ob$en>o de um ob8e$o 7ow da $abela Au/sM e a bus'a da 'on$a para o en.en9eiro asso'iado 'orri.ir o bu.. 5 li$eral da '9ave de re.ra Aue 'orresponde a essa re-erOn'ia de rela'ionamen$o nesse e3emplo K '5n/ineer'.
<?php $bu/s;able $bu/s<o!set $bu/$ $en/ineer

ne! Au/s"+; $bu/s;able3#-etchAll"array"'bu/_status ?'( '25>'++; $bu/s<o!set3#current"+; $bu/$3#-indParent<o!"'Accounts'( '5n/ineer'+;

#l$erna$ivel+M +ou 'an Auer+ rows -rom a paren$ $able usin. a Rma.i' me$9odR. Zend!"b!Table!7ow!#bs$ra'$ invokes $9e me$9odP -indParent<o!"'<;able.lass#'( '<<ule#'+ i- +ou invoke a me$9od on $9e 7ow ob8e'$ ma$'9in. ei$9er o- $9e -ollowin. pa$$ernsP

$ro!3#-indParent<;able.lass#"MZend_Db_;able_4elect $selectN+ $ro!3#-indParent<;able.lass#Ay<<ule#"MZend_Db_;able_4elect $selectN+

Bos padr4es a'imaM <;able.lass# e <<ule# so li$erais Aue 'orrespondem ao nome de 'lasse da $abela meM e a '9ave de re.ra da $abela dependen$e Aue re-eren'ia a $abela me. Nota # iden$idade de $abela e a '9ave de re.ra nomeadas na '9amada do mK$odo devem 'asar e3a$amen$e 'om a di.i$a>o da 'lasse e '9ave de re.ra. Exemplo 10.1&1. Buscando a 9#n*a 8/e usando o 8 todo 8M%#co =sse e3emplo mos$ra a bus'a de ob8e$os 7ows me eAuivalen$es a esses nos e3emplos an$eriores. Besse 'asoM a apli'a>o usa a invo'a>o do mK$odo m.i'o ao invKs de espe'i-i'ar a $abela e re.ra 'omo li$erais.

62E1 *

<?php $bu/s;able ne! Au/s"+; $bu/s<o!set $bu/s;able3#-etchAll"array"'bu/_status $bu/$ $bu/s<o!set3#current"+; // =sa a re/ra de re-erRncia padrFo $reporter $bu/$3#-indParentAccounts"+; // 5speci-ica a re/ra de re-erRncia $en/ineer $bu/$3#-indParentAccountsAy5n/ineer"+;

?'( '25>'++;

10.7.-. Buscando um ob'eto :o+set atra, s de um :elac#onamento 8u#tos0para0 mu#tos


Se vo'O $em um ob8e$o 7ow 'omo resul$ado de um 'onsul$a sobre uma $abela em um rela'ionamen$o mui$os<para<mui$os (para propLsi$os de e3emploM '9ama essa a $abela Tori.inalU)M vo'O pode bus'ar lin9as 'orresponden$es na ou$ra $abela ('9ame essa a $abela Tde des$inoU) via por meio de uma $abela de in$erse'>o. )se o mK$odoP
< $ro!3#-indMany;oMany<o!set"$table( $intersection;able( M$rule$( M$rule%( MZend_D b_;able_4elect $selectNNN+;

=sse mK$odo re$orna um ob8e$o Zend!"b!Table!7owse$!#bs$ra'$ 'on$endo lin9as da $abela $tableM sa$is-azendo o rela'ionamen$o mui$os<para<mui$os. 5 ob8e$o 7ow a$ual da $abela de ori.em K usado para bus'ar lin9as na $abela de in$erse'>oM e isso K 8un$ado F $abela de des$ino. 5 primeiro ar.umen$o $table pode ser um li$erao Aue espe'i-i'ar a $abela Tde des$inoU em um rela'ionamen$o mui$os<para<mui$os por seu nome de 'lasse. ;o'O pode $ambKm espe'i-i'ar a $abela de des$ino pelo uso de um ob8e$o da mesma 'lasse. Example 10.1&2. Fetc*#n% a :o+set +#t* t*e 8any0to0many 8et*od =sse e3emplo mos$ra a ob$en>o de um ob8e$o 7ow da $abela ori.inal Au/sM e a bus'a de lin9a da $abela de des$ino ProductsM represen$ando produ$os rela'ionados ao bu..
<?php $bu/s;able $bu/s<o!set $bu/$%OV $products<o!set

ne! Au/s"+; $bu/s;able3#-ind"$%OV+; $bu/s<o!set3#current"+; $bu/$%OV3#-indMany;oMany<o!set"'Products'( 'Au/sProducts'+;

5 $er'eiro o Auar$o ar.umen$os $rule$ e $rule% so op'ionais. =sses so li$erais Aue nomeiam a '9ave de re.ra no ve$or $_re-erenceMap da $abela de in$erse>>o. # 'a9ve $rule$ nomeia a re.ra para o rela'ionamen$o da $abela de in$erse'>o 'om a $abela ori.inal. Besse e3emploM esse K 6@E1 *

rela'ionamen$o de Au/sProducts para Au/s. # '9ave $rule% nomeia a re.ra para o rela'ionamen$o da $abela de in$erse'>o para a $abela de des$ino. Besse e3emploM esse K o rela'ionamen$o de Au/s para Products. Similarmen$e aos mK$odos para bus'ar lin9as mes e dependen$esM se vo'O no espe'i-i'ar uma re.raM o mK$odo usa a primeira re.ra no ve$or $_re-erenceMap Aue 'asa 'om a $abela no rela'ionamen$o. Se vo'O pre'isar usar uma re.ra ou$ra Aue no a primeiraM vo'O pre'isa espe'i-i'ar a '9ave. Bo e3emplo de 'Ldi.o a'imaM a '9ave de re.ra no -oi espe'i-i'adaM assim as re.ras usadas por padr>oa -oream as primeiras Aue 'asaram. Besse 'asoM $rule$ K '<eporter' e $rule% K 'Product'. Exemplo 10.1&". Buscando um ob'eto :o+set com um 8 todo 8u#tos0para0mu#tos por uma :e%ra EspecK!#ca =sse e3emplo mos$ra a ob$en>o de $abela ori.inal Au/sM e a bus'a de lin9as da $abela de des$ino ProductsM represen$ando produ$os rela'ionados a esse bu..
<?php $bu/s;able $bu/s<o!set $bu/$%OV $products<o!set Au/'+;

ne! Au/s"+; $bu/s;able3#-ind"$%OV+; $bu/s<o!set3#current"+; $bu/$%OV3#-indMany;oMany<o!set"'Products'( 'Au/sProducts'( '

#l$erna$ivamen$eM vo'O pode 'onsul$ar lin9as da $abela de des$ino em um rela'ionamen$o mui$os< para<mui$os usando um TmK$odo m.i'oU. Zend!"b!Table!7ow!#bs$ra'$ invo'a o mK$odoP -indMany;oMany<o!set"'<;able.lass#'( '<9ntersection;able.lass#'( '<<ule$#'( '<<ule%#'+ se vo'O invo'a um mK$odo 'asando AualAuer um dos se.uin$es padr4esP

$ro!3#-ind<;able.lass#Gia<9ntersection;able.lass# "MZend_Db_;able_4elect $selectN+ $ro!3#-ind<;able.lass#Gia<9ntersection;able.lass#Ay<<ule$# "MZend_Db_;able_4elect $selectN+ $ro!3 #-ind<;able.lass#Gia<9ntersection;able.lass#Ay<<ule$#And<<ule% # "MZend_Db_;able_4elect $selectN+

Bos padr4es a'imaM <;able.lass# e <9ntersection;able.lass# so li$erais Aue 'orrespondem aos nomes de 'lasse da $abela de des$ino e a $abela de in$erse'>oM respe'$ivamen$e. <<ule$# e <<ule%# so li$erais Aue 'orrespondem Fs '9aves de re.ra na $abela de in$erse'>o 66E1 *

Aue re-eren'ia a $abela de ori.em e a $abela de des$inoM respe'$ivamen$e. Nota #s iden$idades da $abela e as '9aves de re.ra nomeadas na '9amada de mK$odo devem 'asar e3a$amen$e 'om a di.i$a>o da 'lasse e '9ave de re.ra. Exemplo 10.1&&. Buscando ob'etos :o+sets usando o 8 todo 8M%#co 8u#tos0para0mu#tos =sse e3emplo mos$ra a bus'a de lin9as na $abela de des$ino de um rela'ionamen$o mui$os<para< mui$os represen$ando produ$os rela'ionados a um dado bu..
<?php $bu/s;able ne! Au/s"+; $bu/s<o!set $bu/s;able3#-ind"$%OV+; $bu/$%OV $bu/s<o!set3#current"+; // =sa a re/ra de re-erRncia padrFo $products $bu/$%OV3#-indProductsGiaAu/sProducts"+; // 5speci-ica a re/ra de re-erRncia $products $bu/$%OV3#-indProductsGiaAu/sProductsAyAu/"+;

10.7.1. 5pera.4es de Escr#ta em Cascata


Declare D:D no banco de dados> "e'larara opera>4es em 'as'a$a Zend!"b!Table K al.o pre$endido somen$e para 7"(:S Aue no supor$am in$e.ridade re-eren'ial rela$iva ("7?). 0or e3emploM se vo'O usar a mAuina de armazenamen$o :+?S#: s$ora.eM ou SDLi$eM essas solu>4es no supor$am "7?. ;o'O pode a'9ar N$il de'larar opera>4es me 'as'as$a. Se seu 7"(:S implemen$a "7? e as 'lusulas 72 D585;5 e 72 =PDA;5M vo'O deve de'larar essas 'lusulas em seu esAuema de ban'o de dadosM ao invKs de usar a 'ara'$erCs$i'a de 'as'a$a em Zend!"b!Table. "e'larar re.ras "7? em 'as'a$a K mel9or para a per-orman'eM 'onsis$On'ia e in$e.ridade. 5 mais impor$ran$eM no de'lare opera>4es em 'as'a$a $an$o no 7"(:S Auan$o em sua 'lasse Zend!"b!Table. ;o'O pode de'larar opera>4es em 'as'a$a para e3e'u$ar 'on$ra uma $abela dependen$e Auando vo'O apli'a um =PDA;5 e D585;5 em uma lin9a de uma $abela me. Exemplo 10.1&-. Exemplo de um Delete em Cascata =sse e3emplo mos$ra a e3'luso de uma lin9a na $abela ProductsM Aue K 'on-i.urada para e3'luir au$oma$i'amen$e lin9as dependen$es na $abela Au/s.

E1 *

<?php $products;able ne! Products"+; $products<o!set $products;able3#-ind"$%OV+; $product$%OV $products<o!set3#current"+; $product$%OV3#delete"+; // Auto)atica)ente cascateria para a tabela Au/s // e e*clui linhas dependentes.

Similarmen$eM se vo'O usa =PDA;5 para al$erar o valor de uma '9ave primria na $abela meM vo'O pode Auerer Aue o valor em '9aves es$ran.eiras de $abelas dependen$es se8a au$oma$i'amen$e a$ualizado para 'asar 'om o novo valorM assim $ais re-erOn'ias so man$idadas a$ualizadas. Geralmen$e no K ne'essrio a$ualizar o valor de uma '9ave primria Aue -oi .erada por uma seAWOn'ia ou ou$ro me'anismo. :as se vo'O usar uma natural key Aue possa al$erar o valor o'asionamen$eM K mais 'omum Aue vo'O apliAue a$ualiza>4es em 'as'a$a em $abelas dependen$es. 0ara de'larar um rela'ionamen$o em 'as'a$a na 'lasse Zend!"b!TableM edi$e as re.ras no $_re-erenceMap. &on-i.ure as '9aves do ve$or asso'ia$ivo 'onDelete' e 'on=pdate' para o li$eral Q'as'adeQ (ou a 'ons$an$e sel-,,.A4.AD5). #n$es Aue uma lin9a se8a e3'luCda d a $abela meM ou Aue os valores de suas '9aves primrias se8am a$ualizadosM AuaisAuer lin9as na $abela dependen$e Aue se re-ira a $abela me ser apa.ada ou a$ualizada primeira. Exemplo 10.1&1. Exemplo de Declara./o de 5pera.4es em Cascata Declarat#on o! Cascad#n% 5perat#ons Bo e3emplo abai3oM lin9as na $abela Au/s so e3'luCdas au$oma$i'amen$e se a lin9a na $abela Products para o Aual elas se re-erem -oi e3'luida. 5 elemen$o 'onDelete' do mapa de re-erOn'ia K 'on-i.urado para sel-,,.A4.AD5. Ben9uma a$ualiza>o em 'as'a$a K -ei$a no e3emplo abai3o se o valor da '9ave primria na 'lasse me K al$erado. 5 elemen$o 'on=pdate' da en$rada do mapa de re-erOn'ia K sel-,,<54;<9.;. ;o'O pode ob$er o mesmo resul$ado usando o valor sel-,,27_A.;972M ou pela omisso da en$rada 'on=pdate'.
<?php class Au/sProducts e*tends Zend_Db_;able_Abstract C ... protected $_re-erenceMap array" 'Product' # array" 'colu)ns' # array"'product_id'+( 're-;able.lass' # 'Products'( 're-.olu)ns' # array"'product_id'+( 'onDelete' # sel-,,.A4.AD5( 'on=pdate' # sel-,,<54;<9.; +( ... +; D

1 1E1 *

10.7.1.1. Notas de Cons#dera./o sobre 5pera.4es em Cascata 5pera.4es em cascata #n,ocadas pelo Zend_Db_?able n/o s/o atTm#cas. ?sso si.ni-i'a Aue se seu ban'o de dados implemen$a e -or>a res$ri>4es de in$e.ridade re-eren'ialM um =PDA;5 em 'as'a$a e3e'u$ado pela 'lasse Zend!"b!Table en$ra em 'on-li$o 'om a res$ri>o e resul$a em uma viola>o da in$e.ridade re-eren'ial. ;o'O pode usar =PDA;5 em 'as'a$a em Zend!"b!Table somente se seu ban'o de dados no -or>ar essa res$ri>o de in$e.ridade re-eren'ial. D585;5 em 'as'a$a so-re menos do problema de viola>4es de in$e.ridade re-eren'ial. ;o'O pode e3'luir lin9as dependen$es 'omo a>4es no a$dmi'as an$es de dei3ar $odo mundo en$rar. =n$re$an$oM $an$o para =PDA;5 Auan$o para D585;5M mudar o ban'o de dados em um modo no a$dmi'o $ambKm 'ria o ris'o de Aue eesse ou$ro usurio de ban'o de dados possa ver os dados em um es$ado de in'onsis$On'ia. 0or e3emploM se vo'O e3'luir uma lin9a e $odas as suas lin9as dependen$esM 9 uma peAuena '9an'e de Aue ou$ro pro.rama 'lien$e de ban'o de dados possa 'onsul$ar o ban'o de dados depois Aue vo'O e3'luiru as lin9as dependen$esM mas an$es Aue vo'O e3'lua a lin9a me. =sse pro.rama 'lien$e pode ver a lin9a me sem nen9uma lin9a dependen$eM e assume Aue esse se8a o es$ado pre$endido dos dados. Bo 9 modo para Aue o 'lien$e saba Aue sua 'onsul$a lO o ban'o de dados no meio de uma al$era>o. =sse Aues$o da mudan>a no a$dmi'a pode ser mi$i.ada pelo uso de $ransa>4es para isolar suas al$era>4es. :as al.umas mar'as de 7"(:S no supor$am $ransa>4esM ou permi$em Aue 'lien$es leiam al$era>4es Tsu8asU Aue ainda no $en9am sido subme$idas. 5pera.4es em cascata no Zend_Db_?able s/o #n,ocadas por Zend_Db_?able. =3'lus4es e a$ualiza>4es em 'as'a$a de-inidas em suas 'lasses so apli'aadas se vo'O e3e'u$ar os mK$odos saBe"+ or delete"+ na 'lasse 7ow. =n$re$an$oM se vo'O a$ualizar ou e3'luir dados usando ou$ra in$er-a'eM $al 'omo um -erramen$a de 'onsul$a ou ou$ra apli'a>oM as opera>4es em 'as'a$a no so apli'adas. :esmo Auando usamos os mK$odos update"+ e delete"+ na 'lasse Zend!"b!#dap$er 'lassM opera>4es em 'as'a$a de-inidas em suas 'lasses Zend!"b!Table no so e3e'u$adas. Aem Cascateamento de 9245<;. Bo 9 supor$e para um 9245<; em 'as'a$a. ;o'O deve inver$er uma lin9a em uma $abela me em uma Nni'a opera>oM e inserir lin9a(s) para uma $abela dependen$e em uma opera>o separada.

1 *E1 *

Você também pode gostar