Zend_Db_Select.xml 60 KB

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