Zend_Db_Select.xml 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 19446 -->
  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>El objeto <classname>Zend_Db_Select</classname> object representa una declaración de
  9. consulta <acronym>SELECT</acronym> de <acronym>SQL</acronym>.
  10. La clase tiene métodos para agregar partes individuales a la
  11. consulta. Se pueden especificar algunas partes de la consulta usando
  12. los métodos en <acronym>PHP</acronym> y sus estructuras de datos, y
  13. la clase forma la sintaxis <acronym>SLQ</acronym> correcta. Después de construir la
  14. consulta, puede ejecutarla como si se hubiera escrito como un
  15. string.</para>
  16. <para>Las posibilidades de <classname>Zend_Db_Select</classname>
  17. incluyen:</para>
  18. <itemizedlist>
  19. <listitem>
  20. <para>Métodos Orientados a objetos para especificar consultas
  21. <acronym>SQL</acronym> pieza-a-pieza;</para>
  22. </listitem>
  23. <listitem>
  24. <para>Abstracción de partes de las consultas
  25. <acronym>SQL</acronym>, independiente de la Base de
  26. datos;</para>
  27. </listitem>
  28. <listitem>
  29. <para>Entrecomillado automático de identificadores de metadatos
  30. en la mayoría de los casos, soportanto identificadores que
  31. contienen palabras reservadas de <acronym>SQL</acronym> y
  32. caracteres especiales;</para>
  33. </listitem>
  34. <listitem>
  35. <para>Entrecomillado de identificadores y valores, para ayudar
  36. a reducir el riesgo de ataque por inyección
  37. <acronym>SQL</acronym>.</para>
  38. </listitem>
  39. </itemizedlist>
  40. <para>El uso de <classname>Zend_Db_Select</classname> no es
  41. obligatorio. Para consultas <acronym>SELECT</acronym> muy simples, es usualmente más
  42. simple especificar la consulta completa como un string y ejecutarla
  43. usando un método del Adapter como <methodname>query()</methodname> o
  44. <methodname>fetchAll()</methodname>. Usar
  45. <classname>Zend_Db_Select</classname> es útil si se necesita
  46. ensamblar una consulta <acronym>SELECT</acronym> proceduralmente, o basada en
  47. condiciones lógicas en la aplicación.</para>
  48. </sect2>
  49. <sect2 id="zend.db.select.creating">
  50. <title>Creando un Objeto Select</title>
  51. <para>Se puede crear una instancia del objeto
  52. <classname>Zend_Db_Select</classname> usando el método
  53. <methodname>select()</methodname> de un objeto
  54. <classname>Zend_Db_Adapter_Abstract</classname>.</para>
  55. <example id="zend.db.select.creating.example-db">
  56. <title>Ejemplo del método select() del adaptador</title>
  57. <programlisting language="php"><![CDATA[
  58. $db = Zend_Db::factory( ...options... );
  59. $select = $db->select();
  60. ]]></programlisting>
  61. </example>
  62. <para>Otra manera de crear el objeto
  63. <classname>Zend_Db_Select</classname> es con su constructor,
  64. especificando el adaptador de base de datos como un argumento.</para>
  65. <example id="zend.db.select.creating.example-new">
  66. <title>Ejemplo de creación de un nuevo objeto Select</title>
  67. <programlisting language="php"><![CDATA[
  68. $db = Zend_Db::factory( ...options... );
  69. $select = new Zend_Db_Select($db);
  70. ]]></programlisting>
  71. </example>
  72. </sect2>
  73. <sect2 id="zend.db.select.building">
  74. <title>Construyendo consultas Select</title>
  75. <para>Cuando se construye una consulta, puede agregar cláusulas a ésta,
  76. una por una. Hay un método separado para agregar cada una al objeto
  77. <classname>Zend_Db_Select</classname>.</para>
  78. <example id="zend.db.select.building.example">
  79. <title>Ejemplo de uso de métodos que agregan cláusulas</title>
  80. <programlisting language="php"><![CDATA[
  81. // Crear el objeto Zend_Db_Select
  82. $select = $db->select();
  83. // Agregar una cláusula FROM
  84. $select->from( ...specify table and columns... )
  85. // Agregar una cláusula WHERE
  86. $select->where( ...specify search criteria... )
  87. // Agregar una cláusula ORDER BY
  88. $select->order( ...specify sorting criteria... );
  89. ]]></programlisting>
  90. </example>
  91. <para>También puede utilizar la mayoría de los métodos del objeto
  92. <classname>Zend_Db_Select</classname> con una interfaz fluida.
  93. Una interfaz fluida significa que cada método devuelve una
  94. referencia al objeto que se ha llamado, así se puede llamar
  95. inmediatamente a otro método.</para>
  96. <example id="zend.db.select.building.example-fluent">
  97. <title>Ejemplo de uso de la interfaz fluida.</title>
  98. <programlisting language="php"><![CDATA[
  99. $select = $db->select()
  100. ->from( ...specify table and columns... )
  101. ->where( ...specify search criteria... )
  102. ->order( ...specify sorting criteria... );
  103. ]]></programlisting>
  104. </example>
  105. <para>Los ejemplos en esta sección muestran el uso de la interfaz
  106. fluída, pero también se puede usar la interfaz no-fluída en todos
  107. los casos. A menudo es necesario utilizar la interfaz no-fluída, por
  108. ejemplo, si su aplicación necesita realizar cierta lógica antes de
  109. añadir una cláusula a la consulta.</para>
  110. <sect3 id="zend.db.select.building.from">
  111. <title>Agregando una cláusula FROM</title>
  112. <para>Especifique la tabla para esta consulta usando el método
  113. <methodname>from()</methodname>. Se puede especificar el
  114. nombre de la tabla como un string.
  115. <classname>Zend_Db_Select</classname> aplica el
  116. identificador entrecomillando el nombre de la tabla, así puede
  117. utilizar caracteres especiales.</para>
  118. <example id="zend.db.select.building.from.example">
  119. <title>Ejemplo del método from()</title>
  120. <programlisting language="php"><![CDATA[
  121. // Construye la consulta:
  122. // SELECT *
  123. // FROM "products"
  124. $select = $db->select()
  125. ->from( 'products' );
  126. ]]></programlisting>
  127. </example>
  128. <para>Puede especificar un nombre de correlación (también llamado a
  129. veces "alias de tabla") para una tabla. En lugar de un string,
  130. se usa un array asociativo que mapee el nombre de correlación
  131. con el nombre de la tabla. En otras cláusulas de consulta <acronym>SQL</acronym>,
  132. utilice nombre de correlación. Si su consulta se une con más de
  133. una tabla, <classname>Zend_Db_Select</classname> genera una
  134. correlación unica de nombres basados en el nombre de la tabla,
  135. para una tabla a la cual no se le espicifique un nombre de
  136. correlación.</para>
  137. <example id="zend.db.select.building.from.example-cname">
  138. <title>Ejemplo especificando una tabla con nombre de
  139. correlación</title>
  140. <programlisting language="php"><![CDATA[
  141. // Construya esta consulta:
  142. // SELECT p.*
  143. // FROM "products" AS p
  144. $select = $db->select()
  145. ->from( array('p' => 'products') );
  146. ]]></programlisting>
  147. </example>
  148. <para>Algunos <acronym>RDBMS</acronym> apoyan el uso de un especificador de esquema
  149. para una tabla. Puede especificar el nombre de la tabla como
  150. "<methodname>nombreDeEsquema.nombre DeTabla</methodname>",
  151. donde <classname>Zend_Db_Select</classname> entrecomillará cada
  152. parte individualmente, o tambien puedes especificar el nombre de
  153. esquema por separado. Un nombre de esquema especificado en el
  154. nombre de la tabla toma precedencia en sobre un esquema dado por
  155. separado en el caso de que ambos sean dados.</para>
  156. <example id="zend.db.select.building.from.example-schema">
  157. <title>Ejemplo especificando un nombre de esquema</title>
  158. <programlisting language="php"><![CDATA[
  159. // Construya esta consulta:
  160. // SELECT *
  161. // FROM "myschema"."products"
  162. $select = $db->select()
  163. ->from( 'myschema.products' );
  164. // o
  165. $select = $db->select()
  166. ->from('products', '*', 'myschema');
  167. ]]></programlisting>
  168. </example>
  169. </sect3>
  170. <sect3 id="zend.db.select.building.columns">
  171. <title>Agregando Columnas</title>
  172. <para>En el segundo argumento del método
  173. <methodname>from()</methodname>, puede especificar las
  174. columnas que seleccionar desde la tabla respectiva. Si no
  175. especifica columnas, por defecto será
  176. "<methodname>*</methodname>", el comodín
  177. <acronym>SQL</acronym> para "todas las columnas".</para>
  178. <para>Puede listar las columnas en un simple array de strings, o en
  179. un array asociativo mapeando los alias de columnas a su nombre
  180. de tabla. Si solo se especifica una columna en la consulta y no
  181. necesita especificar un alias de columna, puede listarla solo
  182. con un string en lugar de un array.</para>
  183. <para>Si se entrega un array vacío como el argumento de las tablas,
  184. no se incluirán columnas en el resultado. Vea un <link
  185. linkend="zend.db.select.building.join.example-no-columns"
  186. >código de ejemplo</link> en la sección del método
  187. <methodname>join()</methodname>.</para>
  188. <para>Puedes especificar el nombre de columna como
  189. "<methodname>nombreCorrelacionado.nombreDeColumna</methodname>".
  190. <classname>Zend_Db_Select</classname> entrecomillará cada
  191. parte individualmente. Si no especifica un nombre de correlación
  192. para una columna, se usará el nombre de correlación para la
  193. tabla nombrada en el método actual
  194. <methodname>from()</methodname>.</para>
  195. <example id="zend.db.select.building.columns.example">
  196. <title>Ejemplos especificando columnas</title>
  197. <programlisting language="php"><![CDATA[
  198. // Construir esta consulta:
  199. // SELECT p."product_id", p."product_name"
  200. // FROM "products" AS p
  201. $select = $db->select()
  202. ->from(array('p' => 'products'),
  203. array('product_id', 'product_name'));
  204. // Construir la misma consulta, especificando nombres de correlación
  205. // SELECT p."product_id", p."product_name"
  206. // FROM "products" AS p
  207. $select = $db->select()
  208. ->from(array('p' => 'products'),
  209. array('p.product_id', 'p.product_name'));
  210. // Construir esta consulta con una alias para una columna:
  211. // SELECT p."product_id" AS prodno, p."product_name"
  212. // FROM "products" AS p
  213. $select = $db->select()
  214. ->from(array('p' => 'products'),
  215. array('prodno' => 'product_id', 'product_name'));
  216. ]]></programlisting>
  217. </example>
  218. </sect3>
  219. <sect3 id="zend.db.select.building.columns-expr">
  220. <title>Agregando una Expresión en las Columns</title>
  221. <para>Las columnas en consultas <acronym>SQL</acronym> a veces son
  222. expresiones, no simples columnas de una tabla. Las expresiones
  223. no deberían tener nombres de correlación o entrecomillado
  224. aplicado. Si sus columnas contienen paréntesis,
  225. <classname>Zend_Db_Select</classname> las reconoce como una
  226. expresión.</para>
  227. <para>Tambien puede crear un objeto de tipo
  228. <classname>Zend_Db_Expr</classname> explícitamente, para
  229. prevenir que el string sea tratado como columna.
  230. <classname>Zend_Db_Expr</classname> es una clase mínima, que
  231. contiene un simple string. <classname>Zend_Db_Select</classname>
  232. reconoce el objeto de tipo <classname>Zend_Db_Expr</classname> y
  233. lo convierte de vuelta en el string, pero no le aplica ninguna
  234. alteración, tal como el entrecomillado o la correlación de
  235. nombres.</para>
  236. <note>
  237. <para>El Uso de <classname>Zend_Db_Expr</classname> para
  238. nombres de columnas no es necesario si la expresión de la
  239. columna contiene paréntesis;
  240. <classname>Zend_Db_Select</classname> reconoce y trata
  241. el string como expresión, saltándose el entrecomillado y la
  242. correlación de nombres.</para>
  243. </note>
  244. <example id="zend.db.select.building.columns-expr.example">
  245. <title>Ejemplos especificando columnas que contienen
  246. expresiones</title>
  247. <programlisting language="php"><![CDATA[
  248. // Construya esta consulta:
  249. // SELECT p."product_id", LOWER(product_name)
  250. // FROM "products" AS p
  251. // Una expresion con parentesis implicitamente se transforma en
  252. // un Zend_Db_Expr.
  253. $select = $db->select()
  254. ->from(array('p' => 'products'),
  255. array('product_id', 'LOWER(product_name)'));
  256. // Construya esta consulta:
  257. // SELECT p."product_id", (p.cost * 1.08) AS cost_plus_tax
  258. // FROM "products" AS p
  259. $select = $db->select()
  260. ->from(array('p' => 'products'),
  261. array('product_id',
  262. 'cost_plus_tax' => '(p.cost * 1.08)')
  263. );
  264. // Construya esta consulta usando Zend_Db_Expr explícitamente:
  265. // SELECT p."product_id", p.cost * 1.08 AS cost_plus_tax
  266. // FROM "products" AS p
  267. $select = $db->select()
  268. ->from(array('p' => 'products'),
  269. array('product_id',
  270. 'cost_plus_tax' =>
  271. new Zend_Db_Expr('p.cost * 1.08'))
  272. );
  273. ]]></programlisting>
  274. </example>
  275. <para>En los casos anteriores,
  276. <classname>Zend_Db_Select</classname> no altera el string
  277. para aplicar correlación de nombres o entrecomillado de
  278. identificadores. Si estos cambios son necesarios para resolver
  279. ambigüedades, deberías realizar cambios manualmente en el
  280. string.</para>
  281. <para>Si el nombre de su columna es alguna palabra reservada de
  282. <acronym>SQL</acronym> o contiene caracteres especiales,
  283. debería usar el método
  284. <methodname>quoteIdentifier()</methodname> del Adapdator e
  285. interpolar el resultado en un string. El método
  286. <methodname>quoteIdentifier()</methodname> usa
  287. entrecomillado <acronym>SQL</acronym> para delimitar el
  288. identificador, the identifier, dejando en claro que es un
  289. identificador de tabla o columna y no otra parte de la sintaxis
  290. <acronym>SQL</acronym>.</para>
  291. <para>Su código es más independiente de la base de datos si se usa
  292. el método <methodname>quoteIdentifier()</methodname> en vez de
  293. las excribir literalmente las comillas en la cadena, debido a
  294. que algunos <acronym>RDBMS</acronym> no usan simbolos estándar para entrecomillar
  295. identificadores. El método
  296. <methodname>quoteIdentifier()</methodname> está diseñado
  297. para usar los símbolos apropiados para entrecomillar basado en
  298. el tipo del adaptador. El método
  299. <methodname>quoteIdentifier()</methodname> también escapa
  300. cual caracter de comilla que aparezca en el nombre del
  301. identificador mismo.</para>
  302. <example id="zend.db.select.building.columns-quoteid.example">
  303. <title>Ejemplo de entrecomillado de columnas en una
  304. expresión</title>
  305. <programlisting language="php"><![CDATA[
  306. // Construya esta consulta, entrecomillando el nombre
  307. // especial de la columna llamada "from" en la expresión:
  308. // SELECT p."from" + 10 AS origin
  309. // FROM "products" AS p
  310. $select = $db->select()
  311. ->from(array('p' => 'products'),
  312. array('origin' =>
  313. '(p.' . $db->quoteIdentifier('from') . ' + 10)')
  314. );
  315. ]]></programlisting>
  316. </example>
  317. </sect3>
  318. <sect3 id="zend.db.select.building.columns-atomic">
  319. <title>Agregar columnas a una tabla FROM o JOIN existente</title>
  320. <para>Puede haber casos en los que desea agregar columnas a una
  321. tabla FROM o JOIN después de que estos métodos han sido
  322. llamados. El método <methodname>columns()</methodname> permite
  323. agregar columnas en cualquier punto antes de ejecutar la
  324. consulta. Puedes pasar las columnas bien como un string, un
  325. <classname>Zend_Db_Expr</classname> o un array de estos
  326. elementos. El segundo argumento para este método puede ser
  327. omitido, implicando que las columnas serán agregadas a una tabla
  328. FROM, en otro caso debería usarse un nombre de correlación
  329. existente.</para>
  330. <example id="zend.db.select.building.columns-atomic.example">
  331. <title>Ejemplos agregando columnas con el
  332. método<methodname>columns()</methodname></title>
  333. <programlisting language="php"><![CDATA[
  334. // Construir la consulta:
  335. // SELECT p."product_id", p."product_name"
  336. // FROM "products" AS p
  337. $select = $db->select()
  338. ->from(array('p' => 'products'), 'product_id')
  339. ->columns('product_name');
  340. // Construir la misma consulta, especificando correlación de nombres:
  341. // SELECT p."product_id", p."product_name"
  342. // FROM "products" AS p
  343. $select = $db->select()
  344. ->from(array('p' => 'products'), 'p.product_id')
  345. ->columns('product_name', 'p');
  346. // Alternativamente puede usar columns('p.product_name')
  347. ]]></programlisting>
  348. </example>
  349. </sect3>
  350. <sect3 id="zend.db.select.building.join">
  351. <title>Agregar Otra Tabla a la Consulta Query con JOIN</title>
  352. <para>Muchas consultas útiles involucran el uso de un
  353. <methodname>JOIN</methodname> para combinar filas de
  354. multiples tablas. Puedes agregar tablas a una consulta
  355. <classname>Zend_Db_Select</classname> usando el método
  356. <methodname>join()</methodname>. Usar este método, es
  357. similar al método <methodname>from()</methodname>, excepto que
  358. puedes especificar una condición de unión en la mayoría de los
  359. casos.</para>
  360. <example id="zend.db.select.building.join.example">
  361. <title>Ejemplo del método join()</title>
  362. <programlisting language="php"><![CDATA[
  363. // Construya esta consulta:
  364. // SELECT p."product_id", p."product_name", l.*
  365. // FROM "products" AS p JOIN "line_items" AS l
  366. // ON p.product_id = l.product_id
  367. $select = $db->select()
  368. ->from(array('p' => 'products'),
  369. array('product_id', 'product_name'))
  370. ->join(array('l' => 'line_items'),
  371. 'p.product_id = l.product_id');
  372. ]]></programlisting>
  373. </example>
  374. <para>El segundo argumento <methodname>join()</methodname> es un
  375. string que es usado como condición de unión. Esta es una
  376. expresión que declara un criterio por el cual las filas en una
  377. tabla concuerdan con las filas de la otra tabla. Puedes
  378. especificar correlación de nombres en esta expresión.</para>
  379. <note>
  380. <para>No se aplica entrecomillado en la expresión especificada
  381. para la condición de unión; si tienes problemas con nombres
  382. que necesitan ser entrecomillados, deberás usar
  383. <methodname>quoteIdentifier()</methodname> para formar
  384. el string de condición de unión.</para>
  385. </note>
  386. <para>El tercer argumento <methodname>join()</methodname> es un
  387. array de nombres de columnas, como al usar el método
  388. <methodname>from()</methodname>. Este es por defecto
  389. "<code>*</code>", soporta correlación de
  390. nombres, expresiones, y <classname>Zend_Db_Expr</classname> de
  391. la misma manera que el array de nombres de columnas en el método
  392. <methodname>from()</methodname>.</para>
  393. <para>Para no seleccionar columnas de una tabla, use un array vacío
  394. para la lista de columnas. El uso de esto trabaja con el método
  395. <methodname>from()</methodname> también, pero en general
  396. deseará algunas columnas de la tabla primaria en sus consultas,
  397. a la vez que no se desean columnas de la tabla unida.</para>
  398. <example id="zend.db.select.building.join.example-no-columns">
  399. <title>Ejemplo especificando ninguna columna</title>
  400. <programlisting language="php"><![CDATA[
  401. // Construya esta consulta:
  402. // SELECT p."product_id", p."product_name"
  403. // FROM "products" AS p JOIN "line_items" AS l
  404. // ON p.product_id = l.product_id
  405. $select = $db->select()
  406. ->from(array('p' => 'products'),
  407. array('product_id', 'product_name'))
  408. ->join(array('l' => 'line_items'),
  409. 'p.product_id = l.product_id',
  410. array() ); // empty list of columns
  411. ]]></programlisting>
  412. <para>Note el array vacío <methodname>array()</methodname> en
  413. el ejemplo anterior en lugar de una lista de columnas de la
  414. tabla unida.</para>
  415. </example>
  416. <para>SQL tiene muchos tipos de uniones. Vea una lista a
  417. continuación para los métodos que soporta cada tipo de unión en
  418. <classname>Zend_Db_Select</classname>.</para>
  419. <itemizedlist>
  420. <listitem>
  421. <para>
  422. <command>INNER JOIN</command> con los métodos
  423. <methodname>join(table, join,
  424. [columns])</methodname> o
  425. <methodname>joinInner(table, join,
  426. [columns])</methodname>.</para>
  427. <para>Éste es el tipo de unión más comun. Las filas de cada
  428. tabla son comparadas usando la condición de unión
  429. especificada. El resultado incluye solo las filas que
  430. satisfacen la condición. El resultado puede ser vacío si
  431. no hay filas que satisfagan la condición.</para>
  432. <para>Todos los <acronym>RDBMS</acronym> soportan este tipo de unión.</para>
  433. </listitem>
  434. <listitem>
  435. <para>
  436. <command>LEFT JOIN</command> con el método
  437. <methodname>joinLeft(table, condition,
  438. [columns])</methodname>.</para>
  439. <para>Todas las filas de tabla a la izquierda del operando
  440. son incluidas, pareando las filas de la tabla a la
  441. derecha del operando, y las columnas de la tabla a la
  442. derecha del operando son rellenadas con NULLs si no
  443. existen filas que coincidan con la tabla a la izquierda.</para>
  444. <para>Todos los <acronym>RDBMS</acronym> soportan este tipo de unión.</para>
  445. </listitem>
  446. <listitem>
  447. <para>
  448. <command>RIGHT JOIN</command> con el método
  449. <methodname>joinRight(table, condition,
  450. [columns])</methodname>.</para>
  451. <para>Unión exterior por la derecha es el complementario de
  452. la unión exterior por la izquierda. Todas las filas de
  453. la tabla a la derecha del operando son incluidas,
  454. pareando las filas de la tabla a la izquierda del
  455. operando incluidas, y las columnas de la tabla a la
  456. izquierda del operando son rellenadas con NULLs si no
  457. existen filas que coincidan con la tabla de la derecha.</para>
  458. <para>Algunos <acronym>RDBMS</acronym> no soportan este tipo de join, pero en
  459. general, cualquier unión por la derecha puede
  460. representarse por una unión por la izquierda invirtiendo
  461. el orden de las tablas.</para>
  462. </listitem>
  463. <listitem>
  464. <para>
  465. <command>FULL JOIN</command> con el método
  466. <methodname>joinFull(table, condition,
  467. [columns])</methodname>.</para>
  468. <para>Una unión externa total es como una combinación de
  469. una unión exterior por la izquierda y una unión exterior
  470. por la derecha. Todas las filas de ambas tablas son
  471. incluidas, vinculadas entre sí en la misma fila si
  472. satisfacen la condición de unión, y en otro caso, se
  473. vinculan con valores nulos en lugar de columnas de la
  474. otra tabla.</para>
  475. <para>Algunos <acronym>RDBMS</acronym> no soportan este tipo de unión.</para>
  476. </listitem>
  477. <listitem>
  478. <para>
  479. <command>CROSS JOIN</command> con el método
  480. <methodname>joinCross(table,
  481. [columns])</methodname>.</para>
  482. <para>Una unión cruzada es un Producto Cartesiano. Cada
  483. fila en la primera tabla es pareada con cada una en la
  484. segunda tabla. Por lo tanto, el número de filas en el
  485. resultado es igual al producto del número de filas en
  486. cada tabla. Puede filtrar el conjunto de resultados con
  487. el uso de condiciones en un cláusula <constant>WHERE</constant>; de esta
  488. forma una unión cruzada es similar a la antigua sintaxis
  489. de unión en <acronym>SQL</acronym>-89.</para>
  490. <para>El método <methodname>joinCross()</methodname> no
  491. tiene parámetros para especificar una condición de
  492. unión. Algunos <acronym>RDBMS</acronym>S no soportan este tipo de unión.
  493. </para>
  494. </listitem>
  495. <listitem>
  496. <para>
  497. <command>NATURAL JOIN</command> con el método
  498. <methodname>joinNatural(table,
  499. [columns])</methodname>.</para>
  500. <para>Una unión natural compara cualquier columa(s) que
  501. aparezca con el nombre en ambas tablas. La comparación
  502. es el equivalente de todas las columna(s); comparando
  503. las columnas usando desigualdad no es una unión natural.
  504. Solo la unión interna natural es soportada por este API,
  505. aun cuando <acronym>SQL</acronym> permita una unión
  506. externa natural.</para>
  507. <para>El método <methodname>joinNatural()</methodname> no
  508. tiene parámetros para especificar una condición.</para>
  509. </listitem>
  510. </itemizedlist>
  511. <para>Además de los métodos de unión, puede simplificar las
  512. consultas usando métodos JoinUsing. En vez de proveer una
  513. condición completa a la unión, simplemente pase el nombre de
  514. columna en la que se hará la unión y el objeto
  515. <classname>Zend_Db_Select</classname> completa la condición.</para>
  516. <example id="zend.db.select.building.joinusing.example">
  517. <title>Ejemplo de método joinUsing()</title>
  518. <programlisting language="php"><![CDATA[
  519. // Construya esta consulta:
  520. // SELECT *
  521. // FROM "table1"
  522. // JOIN "table2"
  523. // ON "table1".column1 = "table2".column1
  524. // WHERE column2 = 'foo'
  525. $select = $db->select()
  526. ->from('table1')
  527. ->joinUsing('table2', 'column1')
  528. ->where('column2 = ?', 'foo');
  529. ]]></programlisting>
  530. </example>
  531. <para>Cada uno de los métodos aplicables para uniones en el
  532. componente <classname>Zend_Db_Select</classname> tiene su
  533. correspondiente método 'using' (usando)</para>
  534. <itemizedlist>
  535. <listitem>
  536. <para>
  537. <methodname>joinUsing(table, join,
  538. [columns])</methodname> y
  539. <methodname>joinInnerUsing(table, join,
  540. [columns])</methodname>
  541. </para>
  542. </listitem>
  543. <listitem>
  544. <para>
  545. <methodname>joinLeftUsing(table, join,
  546. [columns])</methodname>
  547. </para>
  548. </listitem>
  549. <listitem>
  550. <para>
  551. <methodname>joinRightUsing(table, join,
  552. [columns])</methodname>
  553. </para>
  554. </listitem>
  555. <listitem>
  556. <para>
  557. <methodname>joinFullUsing(table, join,
  558. [columns])</methodname>
  559. </para>
  560. </listitem>
  561. </itemizedlist>
  562. </sect3>
  563. <sect3 id="zend.db.select.building.where">
  564. <title>Agregar una cláusula WHERE</title>
  565. <para>Puede especificar un criterio para restringir las filas de
  566. resultado usando el método <methodname>where()</methodname>. El
  567. primer argumento de este método es una expresión
  568. <acronym>SQL</acronym>, y esta expresión es usada como una
  569. expresión <acronym>SQL</acronym>
  570. <constant>WHERE</constant> en la consulta.</para>
  571. <example id="zend.db.select.building.where.example">
  572. <title>Ejemplo del método where()</title>
  573. <programlisting language="php"><![CDATA[
  574. // Construya esta consulta:
  575. // SELECT product_id, product_name, price
  576. // FROM "products"
  577. // WHERE price > 100.00
  578. $select = $db->select()
  579. ->from('products',
  580. array('product_id', 'product_name', 'price'))
  581. ->where('price > 100.00');
  582. ]]></programlisting>
  583. </example>
  584. <note>
  585. <para>No se aplica entrecomillado en una expresión dada en el
  586. método <methodname>where()</methodname> u
  587. <methodname>orWhere()</methodname>. Si tiene nombres de
  588. columnas que necesitan ser entrecomillados, debe usar el
  589. método <methodname>quoteIdentifier()</methodname> para
  590. formar el string de la condición.</para>
  591. </note>
  592. <para>El segundo argumento del método
  593. <methodname>where()</methodname> es opcional. Es un valor
  594. para sustituir en la expresión.
  595. <classname>Zend_Db_Select</classname> entrecomilla el valor
  596. y lo sustituye por un signo de interrogación
  597. ("<methodname>?</methodname>") en la expresión.</para>
  598. <para>Este método acepta solo un parámetro. Si tiene una expresión
  599. en la cual necesita sustituir múltiples variables, deberá formar
  600. el string manualmente, interpolando variables y realizando
  601. entrecomillado manualmente.</para>
  602. <example id="zend.db.select.building.where.example-param">
  603. <title>Ejemplo de parámetro en el método where()</title>
  604. <programlisting language="php"><![CDATA[
  605. // Construya esta consulta:
  606. // SELECT product_id, product_name, price
  607. // FROM "products"
  608. // WHERE (price > 100.00)
  609. $minimumPrice = 100;
  610. $select = $db->select()
  611. ->from('products',
  612. array('product_id', 'product_name', 'price'))
  613. ->where('price > ?', $minimumPrice);
  614. ]]></programlisting>
  615. </example>
  616. <para>
  617. You can pass an array as the second parameter to the
  618. <methodname>where()</methodname> method when using the SQL IN operator.
  619. </para>
  620. <example id="zend.db.select.building.where.example-array">
  621. <title>Example of an array parameter in the where() method</title>
  622. <programlisting language="php"><![CDATA[
  623. // Build this query:
  624. // SELECT product_id, product_name, price
  625. // FROM "products"
  626. // WHERE (product_id IN (1, 2, 3))
  627. $productIds = array(1, 2, 3);
  628. $select = $db->select()
  629. ->from('products',
  630. array('product_id', 'product_name', 'price'))
  631. ->where('product_id IN (?)', $productIds);
  632. ]]></programlisting>
  633. </example>
  634. <para>
  635. You can invoke the <methodname>where()</methodname> method multiple times on the
  636. same <classname>Zend_Db_Select</classname> object. The resulting query combines the
  637. multiple terms together using <acronym>AND</acronym> between them.
  638. </para>
  639. <example id="zend.db.select.building.where.example-and">
  640. <title>Ejemplo de métodos where() múltiples</title>
  641. <programlisting language="php"><![CDATA[
  642. // Construya esta consulta:
  643. // SELECT product_id, product_name, price
  644. // FROM "products"
  645. // WHERE (price > 100.00)
  646. // AND (price < 500.00)
  647. $minimumPrice = 100;
  648. $maximumPrice = 500;
  649. $select = $db->select()
  650. ->from('products',
  651. array('product_id', 'product_name', 'price'))
  652. ->where('price > ?', $minimumPrice)
  653. ->where('price < ?', $maximumPrice);
  654. ]]></programlisting>
  655. </example>
  656. <para>Si necesita combinar terminos
  657. usando<acronym>OR</acronym>, use el método
  658. <methodname>orWhere()</methodname>. Este método se usa del
  659. mismo modo que el método <methodname>where()</methodname>,
  660. excepto que el término especificado es precedido por
  661. <acronym>OR</acronym>, en lugar de
  662. <acronym>AND</acronym>.</para>
  663. <example id="zend.db.select.building.where.example-or">
  664. <title>Ejemplo del método orWhere()</title>
  665. <programlisting language="php"><![CDATA[
  666. // Construya esta consulta:
  667. // SELECT product_id, product_name, price
  668. // FROM "products"
  669. // WHERE (price < 100.00)
  670. // OR (price > 500.00)
  671. $minimumPrice = 100;
  672. $maximumPrice = 500;
  673. $select = $db->select()
  674. ->from('products',
  675. array('product_id', 'product_name', 'price'))
  676. ->where('price < ?', $minimumPrice)
  677. ->orWhere('price > ?', $maximumPrice);
  678. ]]></programlisting>
  679. </example>
  680. <para>
  681. <classname>Zend_Db_Select</classname> automáticamente pone
  682. paréntesis alrededor de cada expresión que especifique usando el
  683. método <methodname>where()</methodname> u
  684. <methodname>orWhere()</methodname>. Esto ayuda a asegurar
  685. que la precedencia del operador Booleano no cause resultados
  686. inesperados.</para>
  687. <example id="zend.db.select.building.where.example-parens">
  688. <title>Ejemplos de Expresiones Booleanas con paréntesis</title>
  689. <programlisting language="php"><![CDATA[
  690. // Construya esta consulta:
  691. // SELECT product_id, product_name, price
  692. // FROM "products"
  693. // WHERE (price < 100.00 OR price > 500.00)
  694. // AND (product_name = 'Apple')
  695. $minimumPrice = 100;
  696. $maximumPrice = 500;
  697. $prod = 'Apple';
  698. $select = $db->select()
  699. ->from('products',
  700. array('product_id', 'product_name', 'price'))
  701. ->where("price < $minimumPrice OR price > $maximumPrice")
  702. ->where('product_name = ?', $prod);
  703. ]]></programlisting>
  704. </example>
  705. <para>En el ejemplo anterior, los resultados deberían ser
  706. diferentes sin paréntesis, porque <methodname>AND</methodname>
  707. tiene precedencia más alta respecto a
  708. <methodname>OR</methodname>.
  709. <classname>Zend_Db_Select</classname> aplica el parentesis
  710. con un efecto tal que la expresión en sucesivas llamadas al
  711. método <methodname>where()</methodname> vincula de forma más
  712. fuerte el <methodname>AND</methodname> que combina las
  713. expresiones.</para>
  714. </sect3>
  715. <sect3 id="zend.db.select.building.group">
  716. <title>Agregando una cláusula GROUP BY</title>
  717. <para>En <acronym>SQL</acronym>, la cláusula <command>GROUP
  718. BY</command> permite reducir el número de filas del
  719. resultado de una consulta a una fila por cada valor único
  720. encontrado en la(s) columna(s) nombrada(s) en la cláusula
  721. <command>GROUP BY</command>.</para>
  722. <para>En <classname>Zend_Db_Select</classname>, puede especificar
  723. la(s) columna(s) que usar para el cálculo de grupos de filas
  724. usando el método <methodname>group()</methodname>. El argumento
  725. de este método es una columna o un array de columnas que se
  726. usarán en la cláusula <command>GROUP BY</command>.</para>
  727. <example id="zend.db.select.building.group.example">
  728. <title>Ejemplo del método group()</title>
  729. <programlisting language="php"><![CDATA[
  730. // Construya esta consulta:
  731. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  732. // FROM "products" AS p JOIN "line_items" AS l
  733. // ON p.product_id = l.product_id
  734. // GROUP BY p.product_id
  735. $select = $db->select()
  736. ->from(array('p' => 'products'),
  737. array('product_id'))
  738. ->join(array('l' => 'line_items'),
  739. 'p.product_id = l.product_id',
  740. array('line_items_per_product' => 'COUNT(*)'))
  741. ->group('p.product_id');
  742. ]]></programlisting>
  743. </example>
  744. <para>Como el array de columnas del método
  745. <methodname>from()</methodname>, se puede usar correlación
  746. de nombres en el string de nombre de columna, y la columna será
  747. entrecomillada como un identificador, salvo que el string
  748. contenga paréntesis o sea un objeto de tipo
  749. <classname>Zend_Db_Expr</classname>.</para>
  750. </sect3>
  751. <sect3 id="zend.db.select.building.having">
  752. <title>Agregando una cláusula HAVING</title>
  753. <para>En <acronym>SQL</acronym>, la cláusula
  754. <constant>HAVING</constant> aplica una condición de
  755. restricción en grupos de filas. Es similar a una cláusula
  756. <methodname>WHERE</methodname> aplicando una condición de
  757. restricción a las filas. Pero las 2 cláusulas son diferentes
  758. porque las condiciones <methodname>WHERE</methodname> son
  759. aplicadas antes que definan los grupos, mientras que las
  760. condiciones <constant>HAVING</constant> son aplicadas
  761. después que los grupos son definidos.</para>
  762. <para>En <classname>Zend_Db_Select</classname>, puede especificar
  763. condiciones para restringir grupos usando el método
  764. <methodname>having()</methodname>. Su uso es similar al del
  765. método <methodname>where()</methodname>. El primer agumento es
  766. un string conteniendo una expresión <acronym>SQL</acronym>. El
  767. segundo argumento es un valor que es usado para reemplazar un
  768. parámetro marcador de posición en la expresión
  769. <acronym>SQL</acronym>. Las expresiones dadas en multiples
  770. invocaciones al método <methodname>having()</methodname> son
  771. combinadas usando el operador Booleano
  772. <methodname>AND</methodname>, o el operador
  773. <methodname>OR</methodname> si usa el método
  774. <methodname>orHaving()</methodname>.</para>
  775. <example id="zend.db.select.building.having.example">
  776. <title>Ejemplo del método having()</title>
  777. <programlisting language="php"><![CDATA[
  778. // Construya esta consulta:
  779. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  780. // FROM "products" AS p JOIN "line_items" AS l
  781. // ON p.product_id = l.product_id
  782. // GROUP BY p.product_id
  783. // HAVING line_items_per_product > 10
  784. $select = $db->select()
  785. ->from(array('p' => 'products'),
  786. array('product_id'))
  787. ->join(array('l' => 'line_items'),
  788. 'p.product_id = l.product_id',
  789. array('line_items_per_product' => 'COUNT(*)'))
  790. ->group('p.product_id')
  791. ->having('line_items_per_product > 10');
  792. ]]></programlisting>
  793. </example>
  794. <note>
  795. <para>No se aplica entrecomillado a expresiones dadas al método
  796. <methodname>having()</methodname> u
  797. <methodname>orHaving()</methodname>. Si tiene nombres de
  798. columnas que deban ser entrecomillados, deberá usar
  799. <methodname>quoteIdentifier()</methodname> para formar
  800. el string de la condición.</para>
  801. </note>
  802. </sect3>
  803. <sect3 id="zend.db.select.building.order">
  804. <title>Agregar una cláusula ORDER BY</title>
  805. <para>En <acronym>SQL</acronym>, la cláusula <methodname>ORDER
  806. BY</methodname> especifica una o más columnas o expresiones
  807. por el cual el resultado de la consulta será ordenado. Si
  808. multiples columnas son listadas, las columnas secundarias serán
  809. usadas para resolver relaciones; el orden de clasificación es
  810. determinado por columnas secundarias si la columna anterior
  811. contiene valores idénticos. El orden por defecto es del menor
  812. valor al mayor valor. Puede también ordenar de mayor a menor
  813. valor para una columna dada en la lista espeificando la palabra
  814. clave <methodname>DESC</methodname> después de la columna.</para>
  815. <para>En <classname>Zend_Db_Select</classname>, puede usar el
  816. método <methodname>order()</methodname> para especificar una
  817. columna o un array de columnas por el cual ordenar. Cada
  818. elemento del array es un string nombrando la columna.
  819. Opcionalmente con la palabra reservada
  820. <methodname>ASC</methodname> o <methodname>DESC</methodname>
  821. siguiendola, separada por un espacio.</para>
  822. <para>Como en el método <methodname>from()</methodname> y
  823. <methodname>group()</methodname>, los nombres de columnas
  824. son entrecomillados como identificadores, a menos que contengan
  825. paréntesis o sean un obheto de tipo
  826. <classname>Zend_Db_Expr</classname>.</para>
  827. <example id="zend.db.select.building.order.example">
  828. <title>Ejemplo del método order()</title>
  829. <programlisting language="php"><![CDATA[
  830. // Construya esta consulta:
  831. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  832. // FROM "products" AS p JOIN "line_items" AS l
  833. // ON p.product_id = l.product_id
  834. // GROUP BY p.product_id
  835. // ORDER BY "line_items_per_product" DESC, "product_id"
  836. $select = $db->select()
  837. ->from(array('p' => 'products'),
  838. array('product_id'))
  839. ->join(array('l' => 'line_items'),
  840. 'p.product_id = l.product_id',
  841. array('line_items_per_product' => 'COUNT(*)'))
  842. ->group('p.product_id')
  843. ->order(array('line_items_per_product DESC',
  844. 'product_id'));
  845. ]]></programlisting>
  846. </example>
  847. </sect3>
  848. <sect3 id="zend.db.select.building.limit">
  849. <title>Agregando una cláusula LIMIT</title>
  850. <para>Algunos <acronym>RDBMS</acronym> extienden una consulta <acronym>SQL</acronym>
  851. con una cláusula conocida como <constant>LIMIT</constant>.
  852. Esta cláusuala reduce el número de filas en el resultado a no
  853. más de un número especificado. También puede especificar saltar
  854. el número de filas antes de empezar la salida. Esta
  855. característica hace más fácil tomar un subconjunto de
  856. resultados, por ejemplo cuando mostramos los resultados de una
  857. consulta en páginas progresivas de salida.</para>
  858. <para>En <classname>Zend_Db_Select</classname>, puede usar el
  859. método <methodname>limit()</methodname> para especificar la
  860. cantidad de filas y el número de filas que saltar. El <emphasis>primer</emphasis>
  861. argumento es el método es el número de filas deseado. El <emphasis>segundo</emphasis>
  862. argument es el número de filas que saltar.</para>
  863. <example id="zend.db.select.building.limit.example">
  864. <title>Ejemplo del método limit()</title>
  865. <programlisting language="php"><![CDATA[
  866. // Construya esta consulta:
  867. // SELECT p."product_id", p."product_name"
  868. // FROM "products" AS p
  869. // LIMIT 10, 20
  870. // Equivalente a:
  871. // SELECT p."product_id", p."product_name"
  872. // FROM "products" AS p
  873. // LIMIT 20 OFFSET 10
  874. $select = $db->select()
  875. ->from(array('p' => 'products'),
  876. array('product_id', 'product_name'))
  877. ->limit(10, 20);
  878. ]]></programlisting>
  879. </example>
  880. <note>
  881. <para>La sintaxis de <constant>LIMIT</constant> no está
  882. soportada por todos los <acronym>RDBMS</acronym> brands. Algunos <acronym>RDBMS</acronym>
  883. requieren diferente sintaxis para soportar una funcionalidad
  884. similar Cada clase
  885. <classname>Zend_Db_Adapter_Abstract</classname> incluye
  886. un método para producir el <acronym>SQL</acronym> apropiado
  887. para cada <acronym>RDBMS</acronym>.</para>
  888. </note>
  889. <para>Use el método <methodname>limitPage()</methodname> como un
  890. modo alternativo de especificar la cantidad de filas y el
  891. offset. Este método permite limitar el conjunto resultado a una
  892. serie de subconjuntos de tamaño fijo de filas del total del
  893. resultado de la consulta. En otras palabras, puede especificar
  894. el tamaño de una "página" de resultados, y el número ordinal de
  895. la página simple donde se espera que devuelva la consulta. El
  896. número de página es el primer argumento del método
  897. <methodname>limitPage()</methodname>, y la longitud de la
  898. página es el segundo argumento. Ambos son argumentos requeridos;
  899. no tienen valores por omisión.</para>
  900. <example id="zend.db.select.building.limit.example2">
  901. <title>Ejemplo del método limitPage()</title>
  902. <programlisting language="php"><![CDATA[
  903. // Construya esta consulta:
  904. // SELECT p."product_id", p."product_name"
  905. // FROM "products" AS p
  906. // LIMIT 10, 20
  907. $select = $db->select()
  908. ->from(array('p' => 'products'),
  909. array('product_id', 'product_name'))
  910. ->limitPage(2, 10);
  911. ]]></programlisting>
  912. </example>
  913. </sect3>
  914. <sect3 id="zend.db.select.building.distinct">
  915. <title>Agregar el modificador DISTINCT a la consulta</title>
  916. <para>El método <methodname>distinct()</methodname> permite agregar
  917. la palabra clave a la consulta <constant>DISTINCT</constant>
  918. a su consulta <acronym>SQL</acronym>.</para>
  919. <example id="zend.db.select.building.distinct.example">
  920. <title>Ejemplo del método distinct()</title>
  921. <programlisting language="php"><![CDATA[
  922. // Construya esta consulta:
  923. // SELECT DISTINCT p."product_name"
  924. // FROM "products" AS p
  925. $select = $db->select()
  926. ->distinct()
  927. ->from(array('p' => 'products'), 'product_name');
  928. ]]></programlisting>
  929. </example>
  930. </sect3>
  931. <sect3 id="zend.db.select.building.for-update">
  932. <title>Agregar el modificador FOR UPDATE</title>
  933. <para>El método <methodname>forUpdate()</methodname> permite
  934. agregar el modificador <code>FOR UPDATE</code> a su
  935. consulta <acronym>SQL</acronym>.</para>
  936. <example id="zend.db.select.building.for-update.example">
  937. <title>Example of forUpdate() method</title>
  938. <programlisting language="php"><![CDATA[
  939. // Construya esta consulta:
  940. // SELECT FOR UPDATE p.*
  941. // FROM "products" AS p
  942. $select = $db->select()
  943. ->forUpdate()
  944. ->from(array('p' => 'products'));
  945. ]]></programlisting>
  946. </example>
  947. </sect3>
  948. <sect3 id="zend.db.select.building.union">
  949. <title>Building a UNION Query</title>
  950. <para>
  951. You can build union queries with <classname>Zend_Db_Select</classname> by passing an array
  952. of <classname>Zend_Db_Select</classname> or SQL Query strings into the <methodname>union()</methodname>
  953. method. As second parameter you can pass the <constant>Zend_Db_Select::SQL_UNION</constant> or
  954. <constant>Zend_Db_Select::SQL_UNION_ALL</constant> constants to specify which type of union you
  955. want to perform.
  956. </para>
  957. <example id="zend.db.select.building.union.example">
  958. <title>Example of union() method</title>
  959. <programlisting language="php"><![CDATA[
  960. $sql1 = $db->select();
  961. $sql2 = "SELECT ...";
  962. $select = $db->select()
  963. ->union(array($sql1, $sql2))
  964. ->order("id");
  965. ]]></programlisting>
  966. </example>
  967. </sect3>
  968. </sect2>
  969. <sect2 id="zend.db.select.execute">
  970. <title>Ejecutando consultas Select</title>
  971. <para>En esta sección se describe cómo ejecutar una consulta
  972. representada por un objeto <classname>Zend_Db_Select</classname>.</para>
  973. <sect3 id="zend.db.select.execute.query-adapter">
  974. <title>Ejecutando Consultas SelectExecuting desde el Adaptador de
  975. Base de Datos</title>
  976. <para>Puede ejecutar la consulta representada por el objeto
  977. <classname>Zend_Db_Select</classname> pasándolo como primer
  978. argumento al método <methodname>query()</methodname> de un
  979. objeto <classname>Zend_Db_Adapter_Abstract</classname>. Use
  980. objetos <classname>Zend_Db_Select</classname> en lugar de un
  981. string de consulta.</para>
  982. <para>El método <methodname>query()</methodname> devuelve un objeto
  983. de tipo <classname>Zend_Db_Statement</classname> o PDOStatement, dependiendo del tipo
  984. de adaptador.</para>
  985. <example id="zend.db.select.execute.query-adapter.example">
  986. <title>Ejemplo usando el método adaptador query() del Adaptador
  987. de Base de datos</title>
  988. <programlisting language="php"><![CDATA[
  989. $select = $db->select()
  990. ->from('products');
  991. $stmt = $db->query($select);
  992. $result = $stmt->fetchAll();
  993. ]]></programlisting>
  994. </example>
  995. </sect3>
  996. <sect3 id="zend.db.select.execute.query-select">
  997. <title>Ejecutando Consultas Select desde el Objeto</title>
  998. <para>Como alternativa al uso del método
  999. <methodname>query()</methodname> del objeto adaptador, puede
  1000. usar el método <methodname>query()</methodname> del objeto
  1001. <classname>Zend_Db_Select</classname>. Ambos métodos
  1002. devuelven un objeto de tipo <classname>Zend_Db_Statement</classname> o PDOStatement,
  1003. dependiendo del tipo de adaptador.</para>
  1004. <example id="zend.db.select.execute.query-select.example">
  1005. <title>Ejempo usando el método query() del objeto Select</title>
  1006. <programlisting language="php"><![CDATA[
  1007. $select = $db->select()
  1008. ->from('products');
  1009. $stmt = $select->query();
  1010. $result = $stmt->fetchAll();
  1011. ]]></programlisting>
  1012. </example>
  1013. </sect3>
  1014. <sect3 id="zend.db.select.execute.tostring">
  1015. <title>Convertiendo un Objeto Select a un String
  1016. <acronym>SQL</acronym></title>
  1017. <para>Si necesita acceder a una represantación en un string de la
  1018. consulta <acronym>SQL</acronym> correspondiente al objeto
  1019. <classname>Zend_Db_Select</classname>, use el método
  1020. <methodname>__toString()</methodname>.</para>
  1021. <example id="zend.db.select.execute.tostring.example">
  1022. <title>Ejemplo del método __toString()</title>
  1023. <programlisting language="php"><![CDATA[
  1024. $select = $db->select()
  1025. ->from('products');
  1026. $sql = $select->__toString();
  1027. echo "$sql\n";
  1028. // La salida es el string:
  1029. // SELECT * FROM "products"
  1030. ]]></programlisting>
  1031. </example>
  1032. </sect3>
  1033. </sect2>
  1034. <sect2 id="zend.db.select.other">
  1035. <title>Otros Métodos</title>
  1036. <para>Esta sección describe otros métodos de
  1037. <classname>Zend_Db_Select</classname> que no han sido cubiertos
  1038. antes: <methodname>getPart()</methodname> y
  1039. <methodname>reset()</methodname>.</para>
  1040. <sect3 id="zend.db.select.other.get-part">
  1041. <title>Obtener Partes de un Objeto Select</title>
  1042. <para>El método <methodname>getPart()</methodname> devuelve una
  1043. representación de una parte de su consulta
  1044. <acronym>SQL</acronym>. Por ejemplo, puede usar este método
  1045. para devolver un array de expresiones para la cláusula
  1046. <methodname>WHERE</methodname>, o el array de columnas (o
  1047. expresiones de columnas) que estan en la lista del
  1048. <methodname>SELECT</methodname>, o los valores de la
  1049. cantidad y comienzo para la cláusula
  1050. <constant>LIMIT</constant>.</para>
  1051. <para>El valor de retorno no es un string conteniendo un fragmento
  1052. de la sintaxis <acronym>SQL</acronym>. El valor de retorno es
  1053. una representación, típicamente un array con una estructura que
  1054. contiene valores y expresiones. Cada parte de la consulta tiene
  1055. una estructura diferente.</para>
  1056. <para>El único argumento del método
  1057. <methodname>getPart()</methodname> es un string que
  1058. identifica qué parte del la consulta Select va a devolver. Por
  1059. ejemplo, el string <methodname>'from'</methodname> identifica la
  1060. parte del objeto Select que almacena la información de las
  1061. tablas de la cláusula <methodname>FROM</methodname>, incluyendo
  1062. uniones de tablas.</para>
  1063. <para>La clase <classname>Zend_Db_Select</classname> define
  1064. constantes que puedes usar para las partes de la consulta
  1065. <acronym>SQL</acronym>. Puede usar estas definiciones de
  1066. constantes, o los strings literales.</para>
  1067. <table id="zend.db.select.other.get-part.table">
  1068. <title>Constantes usedas por getPart() y reset()</title>
  1069. <tgroup cols="2">
  1070. <thead>
  1071. <row>
  1072. <entry>Constante</entry>
  1073. <entry>Valor del String</entry>
  1074. </row>
  1075. </thead>
  1076. <tbody>
  1077. <row>
  1078. <entry>
  1079. <constant>Zend_Db_Select::DISTINCT</constant>
  1080. </entry>
  1081. <entry>
  1082. <code>'distinct'</code>
  1083. </entry>
  1084. </row>
  1085. <row>
  1086. <entry>
  1087. <constant>Zend_Db_Select::FOR_UPDATE</constant>
  1088. </entry>
  1089. <entry>
  1090. <code>'forupdate'</code>
  1091. </entry>
  1092. </row>
  1093. <row>
  1094. <entry>
  1095. <constant>Zend_Db_Select::COLUMNS</constant>
  1096. </entry>
  1097. <entry>
  1098. <code>'columns'</code>
  1099. </entry>
  1100. </row>
  1101. <row>
  1102. <entry>
  1103. <constant>Zend_Db_Select::FROM</constant>
  1104. </entry>
  1105. <entry>
  1106. <code>'from'</code>
  1107. </entry>
  1108. </row>
  1109. <row>
  1110. <entry>
  1111. <constant>Zend_Db_Select::WHERE</constant>
  1112. </entry>
  1113. <entry>
  1114. <code>'where'</code>
  1115. </entry>
  1116. </row>
  1117. <row>
  1118. <entry>
  1119. <constant>Zend_Db_Select::GROUP</constant>
  1120. </entry>
  1121. <entry>
  1122. <code>'group'</code>
  1123. </entry>
  1124. </row>
  1125. <row>
  1126. <entry>
  1127. <constant>Zend_Db_Select::HAVING</constant>
  1128. </entry>
  1129. <entry>
  1130. <code>'having'</code>
  1131. </entry>
  1132. </row>
  1133. <row>
  1134. <entry>
  1135. <constant>Zend_Db_Select::ORDER</constant>
  1136. </entry>
  1137. <entry>
  1138. <code>'order'</code>
  1139. </entry>
  1140. </row>
  1141. <row>
  1142. <entry>
  1143. <constant>Zend_Db_Select::LIMIT_COUNT</constant>
  1144. </entry>
  1145. <entry>
  1146. <code>'limitcount'</code>
  1147. </entry>
  1148. </row>
  1149. <row>
  1150. <entry>
  1151. <constant>Zend_Db_Select::LIMIT_OFFSET</constant>
  1152. </entry>
  1153. <entry>
  1154. <code>'limitoffset'</code>
  1155. </entry>
  1156. </row>
  1157. </tbody>
  1158. </tgroup>
  1159. </table>
  1160. <example id="zend.db.select.other.get-part.example">
  1161. <title>Ejemplo del método getPart()</title>
  1162. <programlisting language="php"><![CDATA[
  1163. $select = $db->select()
  1164. ->from('products')
  1165. ->order('product_id');
  1166. // Puede especificar un string literal para especificar la parte
  1167. $orderData = $select->getPart( 'order' );
  1168. // Puede usar una constante para especificar la misma parte
  1169. $orderData = $select->getPart( Zend_Db_Select::ORDER );
  1170. // El valor de retorno puede ser una estructura en un array, no un string.
  1171. // Cada parte tiene distinta estructura.
  1172. print_r( $orderData );
  1173. ]]></programlisting>
  1174. </example>
  1175. </sect3>
  1176. <sect3 id="zend.db.select.other.reset">
  1177. <title>Restableciendo Partes de un Objeto</title>
  1178. <para>El método <methodname>reset()</methodname> permite limpiar
  1179. una parte específica de la consulta <acronym>SQL</acronym>, o
  1180. limpia todas las partes de la consulta <acronym>SQL</acronym> si
  1181. omite el argumento.</para>
  1182. <para>El argumento es opcional. Puede especificar la parte de la
  1183. consulta que será limpiada, usando los mismos strings que usa el
  1184. argumento del método <methodname>getPart()</methodname>. La
  1185. parte de la consulta que especifique se reestablecerá a su
  1186. estado por omisión.</para>
  1187. <para>Si omite el parámetro, <methodname>reset()</methodname>
  1188. cambia todas las partes de la consulta a su estado por omisión.
  1189. Esto hace que el objeto <classname>Zend_Db_Select</classname> sea equivalente a crear
  1190. un nuevo objeto, como si acabase de instanciarlo.</para>
  1191. <example id="zend.db.select.other.reset.example">
  1192. <title>Ejemplo del método reset()</title>
  1193. <programlisting language="php"><![CDATA[
  1194. // Construya esta consulta:
  1195. // SELECT p.*
  1196. // FROM "products" AS p
  1197. // ORDER BY "product_name"
  1198. $select = $db->select()
  1199. ->from(array('p' => 'products')
  1200. ->order('product_name');
  1201. // Requisito cambiado, en su lugar un orden diferente de columnas:
  1202. // SELECT p.*
  1203. // FROM "products" AS p
  1204. // ORDER BY "product_id"
  1205. // Limpia una parte para poder redefinirla
  1206. $select->reset( Zend_Db_Select::ORDER );
  1207. // Y especificar una columna diferente
  1208. $select->order('product_id');
  1209. // Limpia todas las partes de la consulta
  1210. $select->reset();
  1211. ]]></programlisting>
  1212. </example>
  1213. </sect3>
  1214. </sect2>
  1215. </sect1>