Zend_Db_Select.xml 63 KB

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