Zend_Db_Select.xml 72 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 19726 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.db.select">
  5. <title>Zend_Db_Select</title>
  6. <sect2 id="zend.db.select.introduction">
  7. <title>Descripción del Objeto Select</title>
  8. <para>
  9. El objeto
  10. <classname>Zend_Db_Select</classname>
  11. object representa una declaración de
  12. consulta
  13. <acronym>SELECT</acronym>
  14. de
  15. <acronym>SQL</acronym>
  16. .
  17. La clase tiene métodos para agregar partes individuales a la
  18. consulta. Se pueden
  19. especificar algunas partes de la consulta usando
  20. los métodos en
  21. <acronym>PHP</acronym>
  22. y sus estructuras de datos, y
  23. la clase forma la sintaxis
  24. <acronym>SLQ</acronym>
  25. correcta. Después de construir la
  26. consulta, puede ejecutarla como si se hubiera escrito
  27. como un
  28. string.
  29. </para>
  30. <para>
  31. Las posibilidades de
  32. <classname>Zend_Db_Select</classname>
  33. incluyen:
  34. </para>
  35. <itemizedlist>
  36. <listitem>
  37. <para>
  38. Métodos Orientados a objetos para especificar consultas
  39. <acronym>SQL</acronym>
  40. pieza-a-pieza;
  41. </para>
  42. </listitem>
  43. <listitem>
  44. <para>
  45. Abstracción de partes de las consultas
  46. <acronym>SQL</acronym>
  47. , independiente de la Base de
  48. datos;
  49. </para>
  50. </listitem>
  51. <listitem>
  52. <para>
  53. Entrecomillado automático de identificadores de metadatos
  54. en la mayoría de los
  55. casos, soportanto identificadores que
  56. contienen palabras reservadas de
  57. <acronym>SQL</acronym>
  58. y
  59. caracteres especiales;
  60. </para>
  61. </listitem>
  62. <listitem>
  63. <para>
  64. Entrecomillado de identificadores y valores, para ayudar
  65. a reducir el riesgo de
  66. ataque por inyección
  67. <acronym>SQL</acronym>
  68. .
  69. </para>
  70. </listitem>
  71. </itemizedlist>
  72. <para>
  73. El uso de
  74. <classname>Zend_Db_Select</classname>
  75. no es
  76. obligatorio. Para consultas
  77. <acronym>SELECT</acronym>
  78. muy simples, es usualmente más
  79. simple especificar la consulta completa como un string y
  80. ejecutarla
  81. usando un método del Adapter como
  82. <methodname>query()</methodname>
  83. o
  84. <methodname>fetchAll()</methodname>
  85. . Usar
  86. <classname>Zend_Db_Select</classname>
  87. es útil si se necesita
  88. ensamblar una consulta
  89. <acronym>SELECT</acronym>
  90. proceduralmente, o basada en
  91. condiciones lógicas en la aplicación.
  92. </para>
  93. </sect2>
  94. <sect2 id="zend.db.select.creating">
  95. <title>Creando un Objeto Select</title>
  96. <para>
  97. Se puede crear una instancia del objeto
  98. <classname>Zend_Db_Select</classname>
  99. usando el método
  100. <methodname>select()</methodname>
  101. de un objeto
  102. <classname>Zend_Db_Adapter_Abstract</classname>
  103. .
  104. </para>
  105. <example id="zend.db.select.creating.example-db">
  106. <title>Ejemplo del método select() del adaptador</title>
  107. <programlisting language="php"><![CDATA[
  108. $db = Zend_Db::factory( ...options... );
  109. $select = $db->select();
  110. ]]></programlisting>
  111. </example>
  112. <para>
  113. Otra manera de crear el objeto
  114. <classname>Zend_Db_Select</classname>
  115. es con su constructor,
  116. especificando el adaptador de base de datos como un argumento.
  117. </para>
  118. <example id="zend.db.select.creating.example-new">
  119. <title>Ejemplo de creación de un nuevo objeto Select</title>
  120. <programlisting language="php"><![CDATA[
  121. $db = Zend_Db::factory( ...options... );
  122. $select = new Zend_Db_Select($db);
  123. ]]></programlisting>
  124. </example>
  125. </sect2>
  126. <sect2 id="zend.db.select.building">
  127. <title>Construyendo consultas Select</title>
  128. <para>
  129. Cuando se construye una consulta, puede agregar cláusulas a ésta,
  130. una por una. Hay un
  131. método separado para agregar cada una al objeto
  132. <classname>Zend_Db_Select</classname>
  133. .
  134. </para>
  135. <example id="zend.db.select.building.example">
  136. <title>Ejemplo de uso de métodos que agregan cláusulas</title>
  137. <programlisting language="php"><![CDATA[
  138. // Crear el objeto Zend_Db_Select
  139. $select = $db->select();
  140. // Agregar una cláusula FROM
  141. $select->from( ...specify table and columns... )
  142. // Agregar una cláusula WHERE
  143. $select->where( ...specify search criteria... )
  144. // Agregar una cláusula ORDER BY
  145. $select->order( ...specify sorting criteria... );
  146. ]]></programlisting>
  147. </example>
  148. <para>
  149. También puede utilizar la mayoría de los métodos del objeto
  150. <classname>Zend_Db_Select</classname>
  151. con una interfaz fluida.
  152. Una interfaz fluida significa que cada método devuelve una
  153. referencia al objeto que se ha llamado, así se puede llamar
  154. inmediatamente a otro método.
  155. </para>
  156. <example id="zend.db.select.building.example-fluent">
  157. <title>Ejemplo de uso de la interfaz fluida.</title>
  158. <programlisting language="php"><![CDATA[
  159. $select = $db->select()
  160. ->from( ...specify table and columns... )
  161. ->where( ...specify search criteria... )
  162. ->order( ...specify sorting criteria... );
  163. ]]></programlisting>
  164. </example>
  165. <para>Los ejemplos en esta sección muestran el uso de la interfaz
  166. fluída, pero también se
  167. puede usar la interfaz no-fluída en todos
  168. los casos. A menudo es necesario utilizar la
  169. interfaz no-fluída, por
  170. ejemplo, si su aplicación necesita realizar cierta lógica antes
  171. de
  172. añadir una cláusula a la consulta.</para>
  173. <sect3 id="zend.db.select.building.from">
  174. <title>Agregando una cláusula FROM</title>
  175. <para>
  176. Especifique la tabla para esta consulta usando el método
  177. <methodname>from()</methodname>
  178. . Se puede especificar el
  179. nombre de la tabla como un string.
  180. <classname>Zend_Db_Select</classname>
  181. aplica el
  182. identificador entrecomillando el nombre de la tabla, así puede
  183. utilizar
  184. caracteres especiales.
  185. </para>
  186. <example id="zend.db.select.building.from.example">
  187. <title>Ejemplo del método from()</title>
  188. <programlisting language="php"><![CDATA[
  189. // Construye la consulta:
  190. // SELECT *
  191. // FROM "products"
  192. $select = $db->select()
  193. ->from( 'products' );
  194. ]]></programlisting>
  195. </example>
  196. <para>
  197. Puede especificar un nombre de correlación (también llamado a
  198. veces "alias de tabla")
  199. para una tabla. En lugar de un string,
  200. se usa un array asociativo que mapee el nombre
  201. de correlación
  202. con el nombre de la tabla. En otras cláusulas de consulta
  203. <acronym>SQL</acronym>
  204. ,
  205. utilice nombre de correlación. Si su consulta se une con más de
  206. una tabla,
  207. <classname>Zend_Db_Select</classname>
  208. genera una
  209. correlación unica de nombres basados en el nombre de la tabla,
  210. para una
  211. tabla a la cual no se le espicifique un nombre de
  212. correlación.
  213. </para>
  214. <example id="zend.db.select.building.from.example-cname">
  215. <title>Ejemplo especificando una tabla con nombre de
  216. correlación</title>
  217. <programlisting language="php"><![CDATA[
  218. // Construya esta consulta:
  219. // SELECT p.*
  220. // FROM "products" AS p
  221. $select = $db->select()
  222. ->from( array('p' => 'products') );
  223. ]]></programlisting>
  224. </example>
  225. <para>
  226. Algunos
  227. <acronym>RDBMS</acronym>
  228. apoyan el uso de un especificador de esquema
  229. para una tabla. Puede especificar el
  230. nombre de la tabla como
  231. "
  232. "<code>schemaName.tableName</code>"
  233. ",
  234. donde
  235. <classname>Zend_Db_Select</classname>
  236. entrecomillará cada
  237. parte individualmente, o tambien puedes especificar el nombre de
  238. esquema por separado. Un nombre de esquema especificado en el
  239. nombre de la tabla toma
  240. precedencia en sobre un esquema dado por
  241. separado en el caso de que ambos sean dados.
  242. </para>
  243. <example id="zend.db.select.building.from.example-schema">
  244. <title>Ejemplo especificando un nombre de esquema</title>
  245. <programlisting language="php"><![CDATA[
  246. // Construya esta consulta:
  247. // SELECT *
  248. // FROM "myschema"."products"
  249. $select = $db->select()
  250. ->from( 'myschema.products' );
  251. // o
  252. $select = $db->select()
  253. ->from('products', '*', 'myschema');
  254. ]]></programlisting>
  255. </example>
  256. </sect3>
  257. <sect3 id="zend.db.select.building.columns">
  258. <title>Agregando Columnas</title>
  259. <para>
  260. En el segundo argumento del método
  261. <methodname>from()</methodname>
  262. , puede especificar las
  263. columnas que seleccionar desde la tabla respectiva. Si no
  264. especifica columnas, por defecto será
  265. "
  266. <methodname>*</methodname>
  267. ", el comodín
  268. <acronym>SQL</acronym>
  269. para "todas las columnas".
  270. </para>
  271. <para>Puede listar las columnas en un simple array de strings, o en
  272. un array asociativo
  273. mapeando los alias de columnas a su nombre
  274. de tabla. Si solo se especifica una
  275. columna en la consulta y no
  276. necesita especificar un alias de columna, puede listarla
  277. solo
  278. con un string en lugar de un array.</para>
  279. <para>
  280. Si se entrega un array vacío como el argumento de las tablas,
  281. no se incluirán
  282. columnas en el resultado. Vea un
  283. <link linkend="zend.db.select.building.join.example-no-columns">código de
  284. ejemplo</link>
  285. en la sección del método
  286. <methodname>join()</methodname>
  287. .
  288. </para>
  289. <para>
  290. Puedes especificar el nombre de columna como
  291. "
  292. <code>nombreCorrelacionado.nombreDeColumna</code>
  293. ".
  294. <classname>Zend_Db_Select</classname>
  295. entrecomillará cada
  296. parte individualmente. Si no especifica un nombre de correlación
  297. para una columna, se usará el nombre de correlación para la
  298. tabla nombrada en el
  299. método actual
  300. <methodname>from()</methodname>
  301. .
  302. </para>
  303. <example id="zend.db.select.building.columns.example">
  304. <title>Ejemplos especificando columnas</title>
  305. <programlisting language="php"><![CDATA[
  306. // Construir esta consulta:
  307. // SELECT p."product_id", p."product_name"
  308. // FROM "products" AS p
  309. $select = $db->select()
  310. ->from(array('p' => 'products'),
  311. array('product_id', 'product_name'));
  312. // Construir la misma consulta, especificando nombres de correlación
  313. // SELECT p."product_id", p."product_name"
  314. // FROM "products" AS p
  315. $select = $db->select()
  316. ->from(array('p' => 'products'),
  317. array('p.product_id', 'p.product_name'));
  318. // Construir esta consulta con una alias para una columna:
  319. // SELECT p."product_id" AS prodno, p."product_name"
  320. // FROM "products" AS p
  321. $select = $db->select()
  322. ->from(array('p' => 'products'),
  323. array('prodno' => 'product_id', 'product_name'));
  324. ]]></programlisting>
  325. </example>
  326. </sect3>
  327. <sect3 id="zend.db.select.building.columns-expr">
  328. <title>Agregando una Expresión en las Columns</title>
  329. <para>
  330. Las columnas en consultas
  331. <acronym>SQL</acronym>
  332. a veces son
  333. expresiones, no simples columnas de una tabla. Las expresiones
  334. no deberían
  335. tener nombres de correlación o entrecomillado
  336. aplicado. Si sus columnas contienen
  337. paréntesis,
  338. <classname>Zend_Db_Select</classname>
  339. las reconoce como una
  340. expresión.
  341. </para>
  342. <para>
  343. Tambien puede crear un objeto de tipo
  344. <classname>Zend_Db_Expr</classname>
  345. explícitamente, para
  346. prevenir que el string sea tratado como columna.
  347. <classname>Zend_Db_Expr</classname>
  348. es una clase mínima, que
  349. contiene un simple string.
  350. <classname>Zend_Db_Select</classname>
  351. reconoce el objeto de tipo
  352. <classname>Zend_Db_Expr</classname>
  353. y
  354. lo convierte de vuelta en el string, pero no le aplica ninguna
  355. alteración, tal como
  356. el entrecomillado o la correlación de
  357. nombres.
  358. </para>
  359. <note>
  360. <para>
  361. El Uso de
  362. <classname>Zend_Db_Expr</classname>
  363. para
  364. nombres de columnas no es necesario si la expresión de la
  365. columna contiene
  366. paréntesis;
  367. <classname>Zend_Db_Select</classname>
  368. reconoce y trata
  369. el string como expresión, saltándose el entrecomillado y la
  370. correlación de nombres.
  371. </para>
  372. </note>
  373. <example id="zend.db.select.building.columns-expr.example">
  374. <title>Ejemplos especificando columnas que contienen
  375. expresiones</title>
  376. <programlisting language="php"><![CDATA[
  377. // Construya esta consulta:
  378. // SELECT p."product_id", LOWER(product_name)
  379. // FROM "products" AS p
  380. // Una expresion con parentesis implicitamente se transforma en
  381. // un Zend_Db_Expr.
  382. $select = $db->select()
  383. ->from(array('p' => 'products'),
  384. array('product_id', 'LOWER(product_name)'));
  385. // Construya esta consulta:
  386. // SELECT p."product_id", (p.cost * 1.08) AS cost_plus_tax
  387. // FROM "products" AS p
  388. $select = $db->select()
  389. ->from(array('p' => 'products'),
  390. array('product_id',
  391. 'cost_plus_tax' => '(p.cost * 1.08)')
  392. );
  393. // Construya esta consulta usando Zend_Db_Expr explícitamente:
  394. // SELECT p."product_id", p.cost * 1.08 AS cost_plus_tax
  395. // FROM "products" AS p
  396. $select = $db->select()
  397. ->from(array('p' => 'products'),
  398. array('product_id',
  399. 'cost_plus_tax' =>
  400. new Zend_Db_Expr('p.cost * 1.08'))
  401. );
  402. ]]></programlisting>
  403. </example>
  404. <para>
  405. En los casos anteriores,
  406. <classname>Zend_Db_Select</classname>
  407. no altera el string
  408. para aplicar correlación de nombres o entrecomillado de
  409. identificadores. Si estos cambios son necesarios para resolver
  410. ambigüedades, deberías
  411. realizar cambios manualmente en el
  412. string.
  413. </para>
  414. <para>
  415. Si el nombre de su columna es alguna palabra reservada de
  416. <acronym>SQL</acronym>
  417. o contiene caracteres especiales,
  418. debería usar el método
  419. <methodname>quoteIdentifier()</methodname>
  420. del Adapdator e
  421. interpolar el resultado en un string. El método
  422. <methodname>quoteIdentifier()</methodname>
  423. usa
  424. entrecomillado
  425. <acronym>SQL</acronym>
  426. para delimitar el
  427. identificador, the identifier, dejando en claro que es un
  428. identificador de tabla o columna y no otra parte de la sintaxis
  429. <acronym>SQL</acronym>
  430. .
  431. </para>
  432. <para>
  433. Su código es más independiente de la base de datos si se usa
  434. el método
  435. <methodname>quoteIdentifier()</methodname>
  436. en vez de
  437. las excribir literalmente las comillas en la cadena, debido a
  438. que algunos
  439. <acronym>RDBMS</acronym>
  440. no usan simbolos estándar para entrecomillar
  441. identificadores. El método
  442. <methodname>quoteIdentifier()</methodname>
  443. está diseñado
  444. para usar los símbolos apropiados para entrecomillar basado en
  445. el tipo
  446. del adaptador. El método
  447. <methodname>quoteIdentifier()</methodname>
  448. también escapa
  449. cual caracter de comilla que aparezca en el nombre del
  450. identificador
  451. mismo.
  452. </para>
  453. <example id="zend.db.select.building.columns-quoteid.example">
  454. <title>Ejemplo de entrecomillado de columnas en una
  455. expresión</title>
  456. <programlisting language="php"><![CDATA[
  457. // Construya esta consulta, entrecomillando el nombre
  458. // especial de la columna llamada "from" en la expresión:
  459. // SELECT p."from" + 10 AS origin
  460. // FROM "products" AS p
  461. $select = $db->select()
  462. ->from(array('p' => 'products'),
  463. array('origin' =>
  464. '(p.' . $db->quoteIdentifier('from') . ' + 10)')
  465. );
  466. ]]></programlisting>
  467. </example>
  468. </sect3>
  469. <sect3 id="zend.db.select.building.columns-atomic">
  470. <title>Agregar columnas a una tabla FROM o JOIN existente</title>
  471. <para>
  472. Puede haber casos en los que desea agregar columnas a una
  473. tabla FROM o JOIN después
  474. de que estos métodos han sido
  475. llamados. El método
  476. <methodname>columns()</methodname>
  477. permite
  478. agregar columnas en cualquier punto antes de ejecutar la
  479. consulta. Puedes
  480. pasar las columnas bien como un string, un
  481. <classname>Zend_Db_Expr</classname>
  482. o un array de estos
  483. elementos. El segundo argumento para este método puede ser
  484. omitido, implicando que las columnas serán agregadas a una tabla
  485. FROM, en otro caso
  486. debería usarse un nombre de correlación
  487. existente.
  488. </para>
  489. <example id="zend.db.select.building.columns-atomic.example">
  490. <title>
  491. Ejemplos agregando columnas con el
  492. método
  493. <methodname>columns()</methodname>
  494. </title>
  495. <programlisting language="php"><![CDATA[
  496. // Construir la consulta:
  497. // SELECT p."product_id", p."product_name"
  498. // FROM "products" AS p
  499. $select = $db->select()
  500. ->from(array('p' => 'products'), 'product_id')
  501. ->columns('product_name');
  502. // Construir la misma consulta, especificando correlación de nombres:
  503. // SELECT p."product_id", p."product_name"
  504. // FROM "products" AS p
  505. $select = $db->select()
  506. ->from(array('p' => 'products'), 'p.product_id')
  507. ->columns('product_name', 'p');
  508. // Alternativamente puede usar columns('p.product_name')
  509. ]]></programlisting>
  510. </example>
  511. </sect3>
  512. <sect3 id="zend.db.select.building.join">
  513. <title>Agregar Otra Tabla a la Consulta Query con JOIN</title>
  514. <para>
  515. Muchas consultas útiles involucran el uso de un
  516. <acronym>JOIN</acronym>
  517. para combinar filas de
  518. multiples tablas. Puedes agregar tablas a una consulta
  519. <classname>Zend_Db_Select</classname>
  520. usando el método
  521. <methodname>join()</methodname>
  522. . Usar este método, es
  523. similar al método
  524. <methodname>from()</methodname>
  525. , excepto que
  526. puedes especificar una condición de unión en la mayoría de los
  527. casos.
  528. </para>
  529. <example id="zend.db.select.building.join.example">
  530. <title>Ejemplo del método join()</title>
  531. <programlisting language="php"><![CDATA[
  532. // Construya esta consulta:
  533. // SELECT p."product_id", p."product_name", l.*
  534. // FROM "products" AS p JOIN "line_items" AS l
  535. // ON p.product_id = l.product_id
  536. $select = $db->select()
  537. ->from(array('p' => 'products'),
  538. array('product_id', 'product_name'))
  539. ->join(array('l' => 'line_items'),
  540. 'p.product_id = l.product_id');
  541. ]]></programlisting>
  542. </example>
  543. <para>
  544. El segundo argumento
  545. <methodname>join()</methodname>
  546. es un
  547. string que es usado como condición de unión. Esta es una
  548. expresión que declara
  549. un criterio por el cual las filas en una
  550. tabla concuerdan con las filas de la otra
  551. tabla. Puedes
  552. especificar correlación de nombres en esta expresión.
  553. </para>
  554. <note>
  555. <para>
  556. No se aplica entrecomillado en la expresión especificada
  557. para la condición de
  558. unión; si tienes problemas con nombres
  559. que necesitan ser entrecomillados, deberás
  560. usar
  561. <methodname>quoteIdentifier()</methodname>
  562. para formar
  563. el string de condición de unión.
  564. </para>
  565. </note>
  566. <para>
  567. El tercer argumento
  568. <methodname>join()</methodname>
  569. es un
  570. array de nombres de columnas, como al usar el método
  571. <methodname>from()</methodname>
  572. . Este es por defecto
  573. "
  574. <code>*</code>
  575. ", soporta correlación de
  576. nombres, expresiones, y
  577. <classname>Zend_Db_Expr</classname>
  578. de
  579. la misma manera que el array de nombres de columnas en el método
  580. <methodname>from()</methodname>
  581. .
  582. </para>
  583. <para>
  584. Para no seleccionar columnas de una tabla, use un array vacío
  585. para la lista de
  586. columnas. El uso de esto trabaja con el método
  587. <methodname>from()</methodname>
  588. también, pero en general
  589. deseará algunas columnas de la tabla primaria en sus
  590. consultas,
  591. a la vez que no se desean columnas de la tabla unida.
  592. </para>
  593. <example id="zend.db.select.building.join.example-no-columns">
  594. <title>Ejemplo especificando ninguna columna</title>
  595. <programlisting language="php"><![CDATA[
  596. // Construya esta consulta:
  597. // SELECT p."product_id", p."product_name"
  598. // FROM "products" AS p JOIN "line_items" AS l
  599. // ON p.product_id = l.product_id
  600. $select = $db->select()
  601. ->from(array('p' => 'products'),
  602. array('product_id', 'product_name'))
  603. ->join(array('l' => 'line_items'),
  604. 'p.product_id = l.product_id',
  605. array() ); // empty list of columns
  606. ]]></programlisting>
  607. <para>
  608. Note el array vacío
  609. <methodname>array()</methodname>
  610. en
  611. el ejemplo anterior en lugar de una lista de columnas de la
  612. tabla unida.
  613. </para>
  614. </example>
  615. <para>
  616. SQL tiene muchos tipos de uniones. Vea una lista a
  617. continuación para los métodos que
  618. soporta cada tipo de unión en
  619. <classname>Zend_Db_Select</classname>
  620. .
  621. </para>
  622. <itemizedlist>
  623. <listitem>
  624. <para>
  625. <command>INNER JOIN</command>
  626. con los métodos
  627. <methodname>join(table, join,
  628. [columns])</methodname>
  629. o
  630. <methodname>joinInner(table, join,
  631. [columns])</methodname>
  632. .
  633. </para>
  634. <para>Éste es el tipo de unión más comun. Las filas de cada
  635. tabla son comparadas
  636. usando la condición de unión
  637. especificada. El resultado incluye solo las
  638. filas que
  639. satisfacen la condición. El resultado puede ser vacío si
  640. no hay
  641. filas que satisfagan la condición.</para>
  642. <para>
  643. Todos los
  644. <acronym>RDBMS</acronym>
  645. soportan este tipo de unión.
  646. </para>
  647. </listitem>
  648. <listitem>
  649. <para>
  650. <command>LEFT JOIN</command>
  651. con el método
  652. <methodname>joinLeft(table, condition,
  653. [columns])</methodname>
  654. .
  655. </para>
  656. <para>Todas las filas de tabla a la izquierda del operando
  657. son incluidas,
  658. pareando las filas de la tabla a la
  659. derecha del operando, y las columnas de
  660. la tabla a la
  661. derecha del operando son rellenadas con NULLs si no
  662. existen
  663. filas que coincidan con la tabla a la izquierda.</para>
  664. <para>
  665. Todos los
  666. <acronym>RDBMS</acronym>
  667. soportan este tipo de unión.
  668. </para>
  669. </listitem>
  670. <listitem>
  671. <para>
  672. <command>RIGHT JOIN</command>
  673. con el método
  674. <methodname>joinRight(table, condition,
  675. [columns])</methodname>
  676. .
  677. </para>
  678. <para>Unión exterior por la derecha es el complementario de
  679. la unión exterior por
  680. la izquierda. Todas las filas de
  681. la tabla a la derecha del operando son
  682. incluidas,
  683. pareando las filas de la tabla a la izquierda del
  684. operando
  685. incluidas, y las columnas de la tabla a la
  686. izquierda del operando son
  687. rellenadas con NULLs si no
  688. existen filas que coincidan con la tabla de la
  689. derecha.</para>
  690. <para>
  691. Algunos
  692. <acronym>RDBMS</acronym>
  693. no soportan este tipo de join, pero en
  694. general, cualquier unión por la
  695. derecha puede
  696. representarse por una unión por la izquierda invirtiendo
  697. el
  698. orden de las tablas.
  699. </para>
  700. </listitem>
  701. <listitem>
  702. <para>
  703. <command>FULL JOIN</command>
  704. con el método
  705. <methodname>joinFull(table, condition,
  706. [columns])</methodname>
  707. .
  708. </para>
  709. <para>Una unión externa total es como una combinación de
  710. una unión exterior por
  711. la izquierda y una unión exterior
  712. por la derecha. Todas las filas de ambas
  713. tablas son
  714. incluidas, vinculadas entre sí en la misma fila si
  715. satisfacen la
  716. condición de unión, y en otro caso, se
  717. vinculan con valores nulos en lugar de
  718. columnas de la
  719. otra tabla.</para>
  720. <para>
  721. Algunos
  722. <acronym>RDBMS</acronym>
  723. no soportan este tipo de unión.
  724. </para>
  725. </listitem>
  726. <listitem>
  727. <para>
  728. <command>CROSS JOIN</command>
  729. con el método
  730. <methodname>joinCross(table,
  731. [columns])</methodname>
  732. .
  733. </para>
  734. <para>
  735. Una unión cruzada es un Producto Cartesiano. Cada
  736. fila en la primera tabla es
  737. pareada con cada una en la
  738. segunda tabla. Por lo tanto, el número de filas en
  739. el
  740. resultado es igual al producto del número de filas en
  741. cada tabla. Puede
  742. filtrar el conjunto de resultados con
  743. el uso de condiciones en un cláusula
  744. <constant>WHERE</constant>
  745. ; de esta
  746. forma una unión cruzada es similar a la antigua sintaxis
  747. de unión en
  748. <acronym>SQL</acronym>
  749. -89.
  750. </para>
  751. <para>
  752. El método
  753. <methodname>joinCross()</methodname>
  754. no
  755. tiene parámetros para especificar una condición de
  756. unión. Algunos
  757. <acronym>RDBMS</acronym>
  758. S no soportan este tipo de unión.
  759. </para>
  760. </listitem>
  761. <listitem>
  762. <para>
  763. <command>NATURAL JOIN</command>
  764. con el método
  765. <methodname>joinNatural(table,
  766. [columns])</methodname>
  767. .
  768. </para>
  769. <para>
  770. Una unión natural compara cualquier columa(s) que
  771. aparezca con el nombre en
  772. ambas tablas. La comparación
  773. es el equivalente de todas las columna(s);
  774. comparando
  775. las columnas usando desigualdad no es una unión natural.
  776. Solo la
  777. unión interna natural es soportada por este API,
  778. aun cuando
  779. <acronym>SQL</acronym>
  780. permita una unión
  781. externa natural.
  782. </para>
  783. <para>
  784. El método
  785. <methodname>joinNatural()</methodname>
  786. no
  787. tiene parámetros para especificar una condición.
  788. </para>
  789. </listitem>
  790. </itemizedlist>
  791. <para>
  792. Además de los métodos de unión, puede simplificar las
  793. consultas usando métodos
  794. JoinUsing. En vez de proveer una
  795. condición completa a la unión, simplemente pase el
  796. nombre de
  797. columna en la que se hará la unión y el objeto
  798. <classname>Zend_Db_Select</classname>
  799. completa la condición.
  800. </para>
  801. <example id="zend.db.select.building.joinusing.example">
  802. <title>Ejemplo de método joinUsing()</title>
  803. <programlisting language="php"><![CDATA[
  804. // Construya esta consulta:
  805. // SELECT *
  806. // FROM "table1"
  807. // JOIN "table2"
  808. // ON "table1".column1 = "table2".column1
  809. // WHERE column2 = 'foo'
  810. $select = $db->select()
  811. ->from('table1')
  812. ->joinUsing('table2', 'column1')
  813. ->where('column2 = ?', 'foo');
  814. ]]></programlisting>
  815. </example>
  816. <para>
  817. Cada uno de los métodos aplicables para uniones en el
  818. componente
  819. <classname>Zend_Db_Select</classname>
  820. tiene su
  821. correspondiente método 'using' (usando)
  822. </para>
  823. <itemizedlist>
  824. <listitem>
  825. <para>
  826. <methodname>joinUsing(table, join,
  827. [columns])</methodname>
  828. y
  829. <methodname>joinInnerUsing(table, join,
  830. [columns])</methodname>
  831. </para>
  832. </listitem>
  833. <listitem>
  834. <para>
  835. <methodname>joinLeftUsing(table, join,
  836. [columns])</methodname>
  837. </para>
  838. </listitem>
  839. <listitem>
  840. <para>
  841. <methodname>joinRightUsing(table, join,
  842. [columns])</methodname>
  843. </para>
  844. </listitem>
  845. <listitem>
  846. <para>
  847. <methodname>joinFullUsing(table, join,
  848. [columns])</methodname>
  849. </para>
  850. </listitem>
  851. </itemizedlist>
  852. </sect3>
  853. <sect3 id="zend.db.select.building.where">
  854. <title>Agregar una cláusula WHERE</title>
  855. <para>
  856. Puede especificar un criterio para restringir las filas de
  857. resultado usando el método
  858. <methodname>where()</methodname>
  859. . El
  860. primer argumento de este método es una expresión
  861. <acronym>SQL</acronym>
  862. , y esta expresión es usada como una
  863. expresión
  864. <acronym>SQL</acronym>
  865. <constant>WHERE</constant>
  866. en la consulta.
  867. </para>
  868. <example id="zend.db.select.building.where.example">
  869. <title>Ejemplo del método where()</title>
  870. <programlisting language="php"><![CDATA[
  871. // Construya esta consulta:
  872. // SELECT product_id, product_name, price
  873. // FROM "products"
  874. // WHERE price > 100.00
  875. $select = $db->select()
  876. ->from('products',
  877. array('product_id', 'product_name', 'price'))
  878. ->where('price > 100.00');
  879. ]]></programlisting>
  880. </example>
  881. <note>
  882. <para>
  883. No se aplica entrecomillado en una expresión dada en el
  884. método
  885. <methodname>where()</methodname>
  886. u
  887. <methodname>orWhere()</methodname>
  888. . Si tiene nombres de
  889. columnas que necesitan ser entrecomillados, debe usar el
  890. método
  891. <methodname>quoteIdentifier()</methodname>
  892. para
  893. formar el string de la condición.
  894. </para>
  895. </note>
  896. <para>
  897. El segundo argumento del método
  898. <methodname>where()</methodname>
  899. es opcional. Es un valor
  900. para sustituir en la expresión.
  901. <classname>Zend_Db_Select</classname>
  902. entrecomilla el valor
  903. y lo sustituye por un signo de interrogación
  904. ("
  905. <methodname>?</methodname>
  906. ") en la expresión.
  907. </para>
  908. <para>Este método acepta solo un parámetro. Si tiene una expresión
  909. en la cual necesita
  910. sustituir múltiples variables, deberá formar
  911. el string manualmente, interpolando
  912. variables y realizando
  913. entrecomillado manualmente.</para>
  914. <example id="zend.db.select.building.where.example-param">
  915. <title>Ejemplo de parámetro en el método where()</title>
  916. <programlisting language="php"><![CDATA[
  917. // Construya esta consulta:
  918. // SELECT product_id, product_name, price
  919. // FROM "products"
  920. // WHERE (price > 100.00)
  921. $minimumPrice = 100;
  922. $select = $db->select()
  923. ->from('products',
  924. array('product_id', 'product_name', 'price'))
  925. ->where('price > ?', $minimumPrice);
  926. ]]></programlisting>
  927. </example>
  928. <para>
  929. You can pass an array as the second parameter to the
  930. <methodname>where()</methodname>
  931. method when using the SQL IN operator.
  932. </para>
  933. <example id="zend.db.select.building.where.example-array">
  934. <title>Example of an array parameter in the where() method</title>
  935. <programlisting language="php"><![CDATA[
  936. // Build this query:
  937. // SELECT product_id, product_name, price
  938. // FROM "products"
  939. // WHERE (product_id IN (1, 2, 3))
  940. $productIds = array(1, 2, 3);
  941. $select = $db->select()
  942. ->from('products',
  943. array('product_id', 'product_name', 'price'))
  944. ->where('product_id IN (?)', $productIds);
  945. ]]></programlisting>
  946. </example>
  947. <para>
  948. You can invoke the
  949. <methodname>where()</methodname>
  950. method multiple times on the
  951. same
  952. <classname>Zend_Db_Select</classname>
  953. object. The resulting query combines the
  954. multiple terms together using
  955. <acronym>AND</acronym>
  956. between them.
  957. </para>
  958. <example id="zend.db.select.building.where.example-and">
  959. <title>Ejemplo de métodos where() múltiples</title>
  960. <programlisting language="php"><![CDATA[
  961. // Construya esta consulta:
  962. // SELECT product_id, product_name, price
  963. // FROM "products"
  964. // WHERE (price > 100.00)
  965. // AND (price < 500.00)
  966. $minimumPrice = 100;
  967. $maximumPrice = 500;
  968. $select = $db->select()
  969. ->from('products',
  970. array('product_id', 'product_name', 'price'))
  971. ->where('price > ?', $minimumPrice)
  972. ->where('price < ?', $maximumPrice);
  973. ]]></programlisting>
  974. </example>
  975. <para>
  976. Si necesita combinar terminos
  977. usando
  978. <acronym>OR</acronym>
  979. , use el método
  980. <methodname>orWhere()</methodname>
  981. . Este método se usa del
  982. mismo modo que el método
  983. <methodname>where()</methodname>
  984. ,
  985. excepto que el término especificado es precedido por
  986. <acronym>OR</acronym>
  987. , en lugar de
  988. <acronym>AND</acronym>
  989. .
  990. </para>
  991. <example id="zend.db.select.building.where.example-or">
  992. <title>Ejemplo del método orWhere()</title>
  993. <programlisting language="php"><![CDATA[
  994. // Construya esta consulta:
  995. // SELECT product_id, product_name, price
  996. // FROM "products"
  997. // WHERE (price < 100.00)
  998. // OR (price > 500.00)
  999. $minimumPrice = 100;
  1000. $maximumPrice = 500;
  1001. $select = $db->select()
  1002. ->from('products',
  1003. array('product_id', 'product_name', 'price'))
  1004. ->where('price < ?', $minimumPrice)
  1005. ->orWhere('price > ?', $maximumPrice);
  1006. ]]></programlisting>
  1007. </example>
  1008. <para>
  1009. <classname>Zend_Db_Select</classname>
  1010. automáticamente pone
  1011. paréntesis alrededor de cada expresión que especifique usando el
  1012. método
  1013. <methodname>where()</methodname>
  1014. u
  1015. <methodname>orWhere()</methodname>
  1016. . Esto ayuda a asegurar
  1017. que la precedencia del operador Booleano no cause resultados
  1018. inesperados.
  1019. </para>
  1020. <example id="zend.db.select.building.where.example-parens">
  1021. <title>Ejemplos de Expresiones Booleanas con paréntesis</title>
  1022. <programlisting language="php"><![CDATA[
  1023. // Construya esta consulta:
  1024. // SELECT product_id, product_name, price
  1025. // FROM "products"
  1026. // WHERE (price < 100.00 OR price > 500.00)
  1027. // AND (product_name = 'Apple')
  1028. $minimumPrice = 100;
  1029. $maximumPrice = 500;
  1030. $prod = 'Apple';
  1031. $select = $db->select()
  1032. ->from('products',
  1033. array('product_id', 'product_name', 'price'))
  1034. ->where("price < $minimumPrice OR price > $maximumPrice")
  1035. ->where('product_name = ?', $prod);
  1036. ]]></programlisting>
  1037. </example>
  1038. <para>
  1039. En el ejemplo anterior, los resultados deberían ser
  1040. diferentes sin paréntesis, porque
  1041. <acronym>AND</acronym>
  1042. tiene precedencia más alta respecto a
  1043. <acronym>OR</acronym>
  1044. .
  1045. <classname>Zend_Db_Select</classname>
  1046. aplica el parentesis
  1047. con un efecto tal que la expresión en sucesivas llamadas al
  1048. método
  1049. <methodname>where()</methodname>
  1050. vincula de forma más
  1051. fuerte el
  1052. <acronym>AND</acronym>
  1053. que combina las
  1054. expresiones.
  1055. </para>
  1056. </sect3>
  1057. <sect3 id="zend.db.select.building.group">
  1058. <title>Agregando una cláusula GROUP BY</title>
  1059. <para>
  1060. En
  1061. <acronym>SQL</acronym>
  1062. , la cláusula
  1063. <command>GROUP
  1064. BY</command>
  1065. permite reducir el número de filas del
  1066. resultado de una consulta a una fila por cada
  1067. valor único
  1068. encontrado en la(s) columna(s) nombrada(s) en la cláusula
  1069. <command>GROUP BY</command>
  1070. .
  1071. </para>
  1072. <para>
  1073. En
  1074. <classname>Zend_Db_Select</classname>
  1075. , puede especificar
  1076. la(s) columna(s) que usar para el cálculo de grupos de filas
  1077. usando el método
  1078. <methodname>group()</methodname>
  1079. . El argumento
  1080. de este método es una columna o un array de columnas que se
  1081. usarán en
  1082. la cláusula
  1083. <command>GROUP BY</command>
  1084. .
  1085. </para>
  1086. <example id="zend.db.select.building.group.example">
  1087. <title>Ejemplo del método group()</title>
  1088. <programlisting language="php"><![CDATA[
  1089. // Construya esta consulta:
  1090. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  1091. // FROM "products" AS p JOIN "line_items" AS l
  1092. // ON p.product_id = l.product_id
  1093. // GROUP BY p.product_id
  1094. $select = $db->select()
  1095. ->from(array('p' => 'products'),
  1096. array('product_id'))
  1097. ->join(array('l' => 'line_items'),
  1098. 'p.product_id = l.product_id',
  1099. array('line_items_per_product' => 'COUNT(*)'))
  1100. ->group('p.product_id');
  1101. ]]></programlisting>
  1102. </example>
  1103. <para>
  1104. Como el array de columnas del método
  1105. <methodname>from()</methodname>
  1106. , se puede usar correlación
  1107. de nombres en el string de nombre de columna, y la
  1108. columna será
  1109. entrecomillada como un identificador, salvo que el string
  1110. contenga
  1111. paréntesis o sea un objeto de tipo
  1112. <classname>Zend_Db_Expr</classname>
  1113. .
  1114. </para>
  1115. </sect3>
  1116. <sect3 id="zend.db.select.building.having">
  1117. <title>Agregando una cláusula HAVING</title>
  1118. <para>
  1119. En
  1120. <acronym>SQL</acronym>
  1121. , la cláusula
  1122. <constant>HAVING</constant>
  1123. aplica una condición de
  1124. restricción en grupos de filas. Es similar a una cláusula
  1125. <constant>WHERE</constant>
  1126. aplicando una condición de
  1127. restricción a las filas. Pero las 2 cláusulas son
  1128. diferentes
  1129. porque las condiciones
  1130. <constant>WHERE</constant>
  1131. son
  1132. aplicadas antes que definan los grupos, mientras que las
  1133. condiciones
  1134. <constant>HAVING</constant>
  1135. son aplicadas
  1136. después que los grupos son definidos.
  1137. </para>
  1138. <para>
  1139. En
  1140. <classname>Zend_Db_Select</classname>
  1141. , puede especificar
  1142. condiciones para restringir grupos usando el método
  1143. <methodname>having()</methodname>
  1144. . Su uso es similar al del
  1145. método
  1146. <methodname>where()</methodname>
  1147. . El primer agumento es
  1148. un string conteniendo una expresión
  1149. <acronym>SQL</acronym>
  1150. . El
  1151. segundo argumento es un valor que es usado para reemplazar un
  1152. parámetro marcador
  1153. de posición en la expresión
  1154. <acronym>SQL</acronym>
  1155. . Las expresiones dadas en multiples
  1156. invocaciones al método
  1157. <methodname>having()</methodname>
  1158. son
  1159. combinadas usando el operador Booleano
  1160. <methodname>AND</methodname>
  1161. , o el operador
  1162. <code>OR</code>
  1163. si usa el método
  1164. <methodname>orHaving()</methodname>
  1165. .
  1166. </para>
  1167. <example id="zend.db.select.building.having.example">
  1168. <title>Ejemplo del método having()</title>
  1169. <programlisting language="php"><![CDATA[
  1170. // Construya esta consulta:
  1171. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  1172. // FROM "products" AS p JOIN "line_items" AS l
  1173. // ON p.product_id = l.product_id
  1174. // GROUP BY p.product_id
  1175. // HAVING line_items_per_product > 10
  1176. $select = $db->select()
  1177. ->from(array('p' => 'products'),
  1178. array('product_id'))
  1179. ->join(array('l' => 'line_items'),
  1180. 'p.product_id = l.product_id',
  1181. array('line_items_per_product' => 'COUNT(*)'))
  1182. ->group('p.product_id')
  1183. ->having('line_items_per_product > 10');
  1184. ]]></programlisting>
  1185. </example>
  1186. <note>
  1187. <para>
  1188. No se aplica entrecomillado a expresiones dadas al método
  1189. <methodname>having()</methodname>
  1190. u
  1191. <methodname>orHaving()</methodname>
  1192. . Si tiene nombres de
  1193. columnas que deban ser entrecomillados, deberá usar
  1194. <methodname>quoteIdentifier()</methodname>
  1195. para formar
  1196. el string de la condición.
  1197. </para>
  1198. </note>
  1199. </sect3>
  1200. <sect3 id="zend.db.select.building.order">
  1201. <title>Agregar una cláusula ORDER BY</title>
  1202. <para>
  1203. En
  1204. <acronym>SQL</acronym>
  1205. , la cláusula
  1206. <code>ORDER
  1207. BY</code>
  1208. especifica una o más columnas o expresiones
  1209. por el cual el resultado de la consulta
  1210. será ordenado. Si
  1211. multiples columnas son listadas, las columnas secundarias serán
  1212. usadas para resolver relaciones; el orden de clasificación es
  1213. determinado por
  1214. columnas secundarias si la columna anterior
  1215. contiene valores idénticos. El orden por
  1216. defecto es del menor
  1217. valor al mayor valor. Puede también ordenar de mayor a menor
  1218. valor para una columna dada en la lista espeificando la palabra
  1219. clave
  1220. <constant>DESC</constant>
  1221. después de la columna.
  1222. </para>
  1223. <para>
  1224. En
  1225. <classname>Zend_Db_Select</classname>
  1226. , puede usar el
  1227. método
  1228. <methodname>order()</methodname>
  1229. para especificar una
  1230. columna o un array de columnas por el cual ordenar. Cada
  1231. elemento del array es un string nombrando la columna.
  1232. Opcionalmente con la palabra
  1233. reservada
  1234. <constant>ASC</constant>
  1235. o
  1236. <constant>DESC</constant>
  1237. siguiendola, separada por un espacio.
  1238. </para>
  1239. <para>
  1240. Como en el método
  1241. <methodname>from()</methodname>
  1242. y
  1243. <methodname>group()</methodname>
  1244. , los nombres de columnas
  1245. son entrecomillados como identificadores, a menos que
  1246. contengan
  1247. paréntesis o sean un obheto de tipo
  1248. <classname>Zend_Db_Expr</classname>
  1249. .
  1250. </para>
  1251. <example id="zend.db.select.building.order.example">
  1252. <title>Ejemplo del método order()</title>
  1253. <programlisting language="php"><![CDATA[
  1254. // Construya esta consulta:
  1255. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  1256. // FROM "products" AS p JOIN "line_items" AS l
  1257. // ON p.product_id = l.product_id
  1258. // GROUP BY p.product_id
  1259. // ORDER BY "line_items_per_product" DESC, "product_id"
  1260. $select = $db->select()
  1261. ->from(array('p' => 'products'),
  1262. array('product_id'))
  1263. ->join(array('l' => 'line_items'),
  1264. 'p.product_id = l.product_id',
  1265. array('line_items_per_product' => 'COUNT(*)'))
  1266. ->group('p.product_id')
  1267. ->order(array('line_items_per_product DESC',
  1268. 'product_id'));
  1269. ]]></programlisting>
  1270. </example>
  1271. </sect3>
  1272. <sect3 id="zend.db.select.building.limit">
  1273. <title>Agregando una cláusula LIMIT</title>
  1274. <para>
  1275. Algunos
  1276. <acronym>RDBMS</acronym>
  1277. extienden una consulta
  1278. <acronym>SQL</acronym>
  1279. con una cláusula conocida como
  1280. <constant>LIMIT</constant>
  1281. .
  1282. Esta cláusuala reduce el número de filas en el resultado a no
  1283. más de un número
  1284. especificado. También puede especificar saltar
  1285. el número de filas antes de empezar la
  1286. salida. Esta
  1287. característica hace más fácil tomar un subconjunto de
  1288. resultados, por
  1289. ejemplo cuando mostramos los resultados de una
  1290. consulta en páginas progresivas de
  1291. salida.
  1292. </para>
  1293. <para>
  1294. En
  1295. <classname>Zend_Db_Select</classname>
  1296. , puede usar el
  1297. método
  1298. <methodname>limit()</methodname>
  1299. para especificar la
  1300. cantidad de filas y el número de filas que saltar. El
  1301. <emphasis>primer</emphasis>
  1302. argumento es el método es el número de filas deseado. El
  1303. <emphasis>segundo</emphasis>
  1304. argument es el número de filas que saltar.
  1305. </para>
  1306. <example id="zend.db.select.building.limit.example">
  1307. <title>Ejemplo del método limit()</title>
  1308. <programlisting language="php"><![CDATA[
  1309. // Construya esta consulta:
  1310. // SELECT p."product_id", p."product_name"
  1311. // FROM "products" AS p
  1312. // LIMIT 10, 20
  1313. // Equivalente a:
  1314. // SELECT p."product_id", p."product_name"
  1315. // FROM "products" AS p
  1316. // LIMIT 20 OFFSET 10
  1317. $select = $db->select()
  1318. ->from(array('p' => 'products'),
  1319. array('product_id', 'product_name'))
  1320. ->limit(10, 20);
  1321. ]]></programlisting>
  1322. </example>
  1323. <note>
  1324. <para>
  1325. La sintaxis de
  1326. <constant>LIMIT</constant>
  1327. no está
  1328. soportada por todos los
  1329. <acronym>RDBMS</acronym>
  1330. brands. Algunos
  1331. <acronym>RDBMS</acronym>
  1332. requieren diferente sintaxis para soportar una funcionalidad
  1333. similar Cada clase
  1334. <classname>Zend_Db_Adapter_Abstract</classname>
  1335. incluye
  1336. un método para producir el
  1337. <acronym>SQL</acronym>
  1338. apropiado
  1339. para cada
  1340. <acronym>RDBMS</acronym>
  1341. .
  1342. </para>
  1343. </note>
  1344. <para>
  1345. Use el método
  1346. <methodname>limitPage()</methodname>
  1347. como un
  1348. modo alternativo de especificar la cantidad de filas y el
  1349. offset. Este método
  1350. permite limitar el conjunto resultado a una
  1351. serie de subconjuntos de tamaño fijo de
  1352. filas del total del
  1353. resultado de la consulta. En otras palabras, puede especificar
  1354. el
  1355. tamaño de una "página" de resultados, y el número ordinal de
  1356. la página simple donde
  1357. se espera que devuelva la consulta. El
  1358. número de página es el primer argumento del
  1359. método
  1360. <methodname>limitPage()</methodname>
  1361. , y la longitud de la
  1362. página es el segundo argumento. Ambos son argumentos
  1363. requeridos;
  1364. no tienen valores por omisión.
  1365. </para>
  1366. <example id="zend.db.select.building.limit.example2">
  1367. <title>Ejemplo del método limitPage()</title>
  1368. <programlisting language="php"><![CDATA[
  1369. // Construya esta consulta:
  1370. // SELECT p."product_id", p."product_name"
  1371. // FROM "products" AS p
  1372. // LIMIT 10, 20
  1373. $select = $db->select()
  1374. ->from(array('p' => 'products'),
  1375. array('product_id', 'product_name'))
  1376. ->limitPage(2, 10);
  1377. ]]></programlisting>
  1378. </example>
  1379. </sect3>
  1380. <sect3 id="zend.db.select.building.distinct">
  1381. <title>Agregar el modificador DISTINCT a la consulta</title>
  1382. <para>
  1383. El método
  1384. <methodname>distinct()</methodname>
  1385. permite agregar
  1386. la palabra clave a la consulta
  1387. <constant>DISTINCT</constant>
  1388. a su consulta
  1389. <acronym>SQL</acronym>
  1390. .
  1391. </para>
  1392. <example id="zend.db.select.building.distinct.example">
  1393. <title>Ejemplo del método distinct()</title>
  1394. <programlisting language="php"><![CDATA[
  1395. // Construya esta consulta:
  1396. // SELECT DISTINCT p."product_name"
  1397. // FROM "products" AS p
  1398. $select = $db->select()
  1399. ->distinct()
  1400. ->from(array('p' => 'products'), 'product_name');
  1401. ]]></programlisting>
  1402. </example>
  1403. </sect3>
  1404. <sect3 id="zend.db.select.building.for-update">
  1405. <title>Agregar el modificador FOR UPDATE</title>
  1406. <para>
  1407. El método
  1408. <methodname>forUpdate()</methodname>
  1409. permite
  1410. agregar el modificador
  1411. <code>FOR UPDATE</code>
  1412. a su
  1413. consulta
  1414. <acronym>SQL</acronym>
  1415. .
  1416. </para>
  1417. <example id="zend.db.select.building.for-update.example">
  1418. <title>Example of forUpdate() method</title>
  1419. <programlisting language="php"><![CDATA[
  1420. // Construya esta consulta:
  1421. // SELECT FOR UPDATE p.*
  1422. // FROM "products" AS p
  1423. $select = $db->select()
  1424. ->forUpdate()
  1425. ->from(array('p' => 'products'));
  1426. ]]></programlisting>
  1427. </example>
  1428. </sect3>
  1429. <sect3 id="zend.db.select.building.union">
  1430. <title>Building a UNION Query</title>
  1431. <para>
  1432. You can build union queries with
  1433. <classname>Zend_Db_Select</classname>
  1434. by passing an array
  1435. of
  1436. <classname>Zend_Db_Select</classname>
  1437. or SQL Query strings into the
  1438. <methodname>union()</methodname>
  1439. method. As second parameter you can pass the
  1440. <constant>Zend_Db_Select::SQL_UNION</constant>
  1441. or
  1442. <constant>Zend_Db_Select::SQL_UNION_ALL</constant>
  1443. constants to specify which type of union you
  1444. want to perform.
  1445. </para>
  1446. <example id="zend.db.select.building.union.example">
  1447. <title>Example of union() method</title>
  1448. <programlisting language="php"><![CDATA[
  1449. $sql1 = $db->select();
  1450. $sql2 = "SELECT ...";
  1451. $select = $db->select()
  1452. ->union(array($sql1, $sql2))
  1453. ->order("id");
  1454. ]]></programlisting>
  1455. </example>
  1456. </sect3>
  1457. </sect2>
  1458. <sect2 id="zend.db.select.execute">
  1459. <title>Ejecutando consultas Select</title>
  1460. <para>
  1461. En esta sección se describe cómo ejecutar una consulta
  1462. representada por un objeto
  1463. <classname>Zend_Db_Select</classname>
  1464. .
  1465. </para>
  1466. <sect3 id="zend.db.select.execute.query-adapter">
  1467. <title>Ejecutando Consultas SelectExecuting desde el Adaptador de
  1468. Base de Datos</title>
  1469. <para>
  1470. Puede ejecutar la consulta representada por el objeto
  1471. <classname>Zend_Db_Select</classname>
  1472. pasándolo como primer
  1473. argumento al método
  1474. <methodname>query()</methodname>
  1475. de un
  1476. objeto
  1477. <classname>Zend_Db_Adapter_Abstract</classname>
  1478. . Use
  1479. objetos
  1480. <classname>Zend_Db_Select</classname>
  1481. en lugar de un
  1482. string de consulta.
  1483. </para>
  1484. <para>
  1485. El método
  1486. <methodname>query()</methodname>
  1487. devuelve un objeto
  1488. de tipo
  1489. <classname>Zend_Db_Statement</classname>
  1490. o PDOStatement, dependiendo del tipo
  1491. de adaptador.
  1492. </para>
  1493. <example id="zend.db.select.execute.query-adapter.example">
  1494. <title>Ejemplo usando el método adaptador query() del Adaptador
  1495. de Base de datos</title>
  1496. <programlisting language="php"><![CDATA[
  1497. $select = $db->select()
  1498. ->from('products');
  1499. $stmt = $db->query($select);
  1500. $result = $stmt->fetchAll();
  1501. ]]></programlisting>
  1502. </example>
  1503. </sect3>
  1504. <sect3 id="zend.db.select.execute.query-select">
  1505. <title>Ejecutando Consultas Select desde el Objeto</title>
  1506. <para>
  1507. Como alternativa al uso del método
  1508. <methodname>query()</methodname>
  1509. del objeto adaptador, puede
  1510. usar el método
  1511. <methodname>query()</methodname>
  1512. del objeto
  1513. <classname>Zend_Db_Select</classname>
  1514. . Ambos métodos
  1515. devuelven un objeto de tipo
  1516. <classname>Zend_Db_Statement</classname>
  1517. o PDOStatement,
  1518. dependiendo del tipo de adaptador.
  1519. </para>
  1520. <example id="zend.db.select.execute.query-select.example">
  1521. <title>Ejempo usando el método query() del objeto Select</title>
  1522. <programlisting language="php"><![CDATA[
  1523. $select = $db->select()
  1524. ->from('products');
  1525. $stmt = $select->query();
  1526. $result = $stmt->fetchAll();
  1527. ]]></programlisting>
  1528. </example>
  1529. </sect3>
  1530. <sect3 id="zend.db.select.execute.tostring">
  1531. <title>
  1532. Convertiendo un Objeto Select a un String
  1533. <acronym>SQL</acronym>
  1534. </title>
  1535. <para>
  1536. Si necesita acceder a una represantación en un string de la
  1537. consulta
  1538. <acronym>SQL</acronym>
  1539. correspondiente al objeto
  1540. <classname>Zend_Db_Select</classname>
  1541. , use el método
  1542. <methodname>__toString()</methodname>
  1543. .
  1544. </para>
  1545. <example id="zend.db.select.execute.tostring.example">
  1546. <title>Ejemplo del método __toString()</title>
  1547. <programlisting language="php"><![CDATA[
  1548. $select = $db->select()
  1549. ->from('products');
  1550. $sql = $select->__toString();
  1551. echo "$sql\n";
  1552. // La salida es el string:
  1553. // SELECT * FROM "products"
  1554. ]]></programlisting>
  1555. </example>
  1556. </sect3>
  1557. </sect2>
  1558. <sect2 id="zend.db.select.other">
  1559. <title>Otros Métodos</title>
  1560. <para>
  1561. Esta sección describe otros métodos de
  1562. <classname>Zend_Db_Select</classname>
  1563. que no han sido cubiertos
  1564. antes:
  1565. <methodname>getPart()</methodname>
  1566. y
  1567. <methodname>reset()</methodname>
  1568. .
  1569. </para>
  1570. <sect3 id="zend.db.select.other.get-part">
  1571. <title>Obtener Partes de un Objeto Select</title>
  1572. <para>
  1573. El método
  1574. <methodname>getPart()</methodname>
  1575. devuelve una
  1576. representación de una parte de su consulta
  1577. <acronym>SQL</acronym>
  1578. . Por ejemplo, puede usar este método
  1579. para devolver un array de expresiones para la
  1580. cláusula
  1581. <constant>WHERE</constant>
  1582. , o el array de columnas (o
  1583. expresiones de columnas) que estan en la lista del
  1584. <constant>SELECT</constant>
  1585. , o los valores de la
  1586. cantidad y comienzo para la cláusula
  1587. <constant>LIMIT</constant>
  1588. .
  1589. </para>
  1590. <para>
  1591. El valor de retorno no es un string conteniendo un fragmento
  1592. de la sintaxis
  1593. <acronym>SQL</acronym>
  1594. . El valor de retorno es
  1595. una representación, típicamente un array con una estructura
  1596. que
  1597. contiene valores y expresiones. Cada parte de la consulta tiene
  1598. una estructura
  1599. diferente.
  1600. </para>
  1601. <para>
  1602. El único argumento del método
  1603. <methodname>getPart()</methodname>
  1604. es un string que
  1605. identifica qué parte del la consulta Select va a devolver. Por
  1606. ejemplo, el string
  1607. <code>'from'</code>
  1608. identifica la
  1609. parte del objeto Select que almacena la información de las
  1610. tablas de la
  1611. cláusula
  1612. <constant>FROM</constant>
  1613. , incluyendo
  1614. uniones de tablas.
  1615. </para>
  1616. <para>
  1617. La clase
  1618. <classname>Zend_Db_Select</classname>
  1619. define
  1620. constantes que puedes usar para las partes de la consulta
  1621. <acronym>SQL</acronym>
  1622. . Puede usar estas definiciones de
  1623. constantes, o los strings literales.
  1624. </para>
  1625. <table id="zend.db.select.other.get-part.table">
  1626. <title>Constantes usedas por getPart() y reset()</title>
  1627. <tgroup cols="2">
  1628. <thead>
  1629. <row>
  1630. <entry>Constante</entry>
  1631. <entry>Valor del String</entry>
  1632. </row>
  1633. </thead>
  1634. <tbody>
  1635. <row>
  1636. <entry>
  1637. <constant>Zend_Db_Select::DISTINCT</constant>
  1638. </entry>
  1639. <entry>
  1640. <code>'distinct'</code>
  1641. </entry>
  1642. </row>
  1643. <row>
  1644. <entry>
  1645. <constant>Zend_Db_Select::FOR_UPDATE</constant>
  1646. </entry>
  1647. <entry>
  1648. <code>'forupdate'</code>
  1649. </entry>
  1650. </row>
  1651. <row>
  1652. <entry>
  1653. <constant>Zend_Db_Select::COLUMNS</constant>
  1654. </entry>
  1655. <entry>
  1656. <code>'columns'</code>
  1657. </entry>
  1658. </row>
  1659. <row>
  1660. <entry>
  1661. <constant>Zend_Db_Select::FROM</constant>
  1662. </entry>
  1663. <entry>
  1664. <code>'from'</code>
  1665. </entry>
  1666. </row>
  1667. <row>
  1668. <entry>
  1669. <constant>Zend_Db_Select::WHERE</constant>
  1670. </entry>
  1671. <entry>
  1672. <code>'where'</code>
  1673. </entry>
  1674. </row>
  1675. <row>
  1676. <entry>
  1677. <constant>Zend_Db_Select::GROUP</constant>
  1678. </entry>
  1679. <entry>
  1680. <code>'group'</code>
  1681. </entry>
  1682. </row>
  1683. <row>
  1684. <entry>
  1685. <constant>Zend_Db_Select::HAVING</constant>
  1686. </entry>
  1687. <entry>
  1688. <code>'having'</code>
  1689. </entry>
  1690. </row>
  1691. <row>
  1692. <entry>
  1693. <constant>Zend_Db_Select::ORDER</constant>
  1694. </entry>
  1695. <entry>
  1696. <code>'order'</code>
  1697. </entry>
  1698. </row>
  1699. <row>
  1700. <entry>
  1701. <constant>Zend_Db_Select::LIMIT_COUNT</constant>
  1702. </entry>
  1703. <entry>
  1704. <code>'limitcount'</code>
  1705. </entry>
  1706. </row>
  1707. <row>
  1708. <entry>
  1709. <constant>Zend_Db_Select::LIMIT_OFFSET</constant>
  1710. </entry>
  1711. <entry>
  1712. <code>'limitoffset'</code>
  1713. </entry>
  1714. </row>
  1715. </tbody>
  1716. </tgroup>
  1717. </table>
  1718. <example id="zend.db.select.other.get-part.example">
  1719. <title>Ejemplo del método getPart()</title>
  1720. <programlisting language="php"><![CDATA[
  1721. $select = $db->select()
  1722. ->from('products')
  1723. ->order('product_id');
  1724. // Puede especificar un string literal para especificar la parte
  1725. $orderData = $select->getPart( 'order' );
  1726. // Puede usar una constante para especificar la misma parte
  1727. $orderData = $select->getPart( Zend_Db_Select::ORDER );
  1728. // El valor de retorno puede ser una estructura en un array, no un string.
  1729. // Cada parte tiene distinta estructura.
  1730. print_r( $orderData );
  1731. ]]></programlisting>
  1732. </example>
  1733. </sect3>
  1734. <sect3 id="zend.db.select.other.reset">
  1735. <title>Restableciendo Partes de un Objeto</title>
  1736. <para>
  1737. El método
  1738. <methodname>reset()</methodname>
  1739. permite limpiar
  1740. una parte específica de la consulta
  1741. <acronym>SQL</acronym>
  1742. , o
  1743. limpia todas las partes de la consulta
  1744. <acronym>SQL</acronym>
  1745. si
  1746. omite el argumento.
  1747. </para>
  1748. <para>
  1749. El argumento es opcional. Puede especificar la parte de la
  1750. consulta que será
  1751. limpiada, usando los mismos strings que usa el
  1752. argumento del método
  1753. <methodname>getPart()</methodname>
  1754. . La
  1755. parte de la consulta que especifique se reestablecerá a su
  1756. estado por omisión.
  1757. </para>
  1758. <para>
  1759. Si omite el parámetro,
  1760. <methodname>reset()</methodname>
  1761. cambia todas las partes de la consulta a su estado por omisión.
  1762. Esto hace que el
  1763. objeto
  1764. <classname>Zend_Db_Select</classname>
  1765. sea equivalente a crear
  1766. un nuevo objeto, como si acabase de instanciarlo.
  1767. </para>
  1768. <example id="zend.db.select.other.reset.example">
  1769. <title>Ejemplo del método reset()</title>
  1770. <programlisting language="php"><![CDATA[
  1771. // Construya esta consulta:
  1772. // SELECT p.*
  1773. // FROM "products" AS p
  1774. // ORDER BY "product_name"
  1775. $select = $db->select()
  1776. ->from(array('p' => 'products')
  1777. ->order('product_name');
  1778. // Requisito cambiado, en su lugar un orden diferente de columnas:
  1779. // SELECT p.*
  1780. // FROM "products" AS p
  1781. // ORDER BY "product_id"
  1782. // Limpia una parte para poder redefinirla
  1783. $select->reset( Zend_Db_Select::ORDER );
  1784. // Y especificar una columna diferente
  1785. $select->order('product_id');
  1786. // Limpia todas las partes de la consulta
  1787. $select->reset();
  1788. ]]></programlisting>
  1789. </example>
  1790. </sect3>
  1791. </sect2>
  1792. </sect1>