Zend_Db_Select.xml 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.db.select">
  5. <title>Zend_Db_Select</title>
  6. <sect2 id="zend.db.select.introduction">
  7. <title>Introduction</title>
  8. <para>
  9. L'objet <classname>Zend_Db_Select</classname> représente une instruction de
  10. requête <acronym>SQL</acronym> de type <constant>SELECT</constant>. La classe a des méthodes pour ajouter
  11. différentes parties à la requête. Vous pouvez indiquer quelques parties de la requête en
  12. utilisant des structures de données et des méthodes de <acronym>PHP</acronym>, et la classe forme la
  13. syntaxe correcte de <acronym>SQL</acronym> pour vous. Après avoir construit une requête, vous pouvez
  14. l'exécuter comme si vous l'aviez écrite comme une chaîne de caractères.
  15. </para>
  16. <para>
  17. Les possibilités offertes par <classname>Zend_Db_Select</classname> inclut&#160;:
  18. </para>
  19. <itemizedlist>
  20. <listitem>
  21. <para>
  22. des méthodes orientées objet pour spécifier des requêtes <acronym>SQL</acronym> morceau par
  23. morceau&#160;;
  24. </para>
  25. </listitem>
  26. <listitem>
  27. <para>
  28. l'abstraction de certaines parties de la requête <acronym>SQL</acronym> indépendamment de la
  29. base de données&#160;;
  30. </para>
  31. </listitem>
  32. <listitem>
  33. <para>
  34. l'échappement automatique des identificateurs de méta-données dans la
  35. plupart des cas, pour supporter les identificateurs contenant les mots réservés
  36. <acronym>SQL</acronym> et les caractères spéciaux&#160;;
  37. </para>
  38. </listitem>
  39. <listitem>
  40. <para>
  41. l'échappement des identificateurs et des valeurs, afin de réduire les
  42. risques d'attaques par injection <acronym>SQL</acronym>.
  43. </para>
  44. </listitem>
  45. </itemizedlist>
  46. <para>
  47. L'utilisation de <classname>Zend_Db_Select</classname> n'est pas obligatoire. Pour
  48. de très simple requêtes SELECT , il est d'habitude plus simple de spécifier la requête
  49. <acronym>SQL</acronym> entière comme une chaîne et l'exécuter en utilisant des méthodes de l'adaptateur
  50. comme <methodname>query()</methodname> ou <methodname>fetchAll()</methodname>. L'utilisation de
  51. <classname>Zend_Db_Select</classname> est utile si vous devez assembler une requête
  52. SELECT par procédure, ou basé sur une logique conditionnelle dans votre
  53. application.
  54. </para>
  55. </sect2>
  56. <sect2 id="zend.db.select.creating">
  57. <title>Créer un objet Select</title>
  58. <para>
  59. Vous pouvez créer une instance d'un objet <classname>Zend_Db_Select</classname> en
  60. utilisant la méthode <methodname>select()</methodname> de l'objet
  61. <classname>Zend_Db_Adapter_Abstract</classname>.
  62. </para>
  63. <example id="zend.db.select.creating.example-db">
  64. <title>Exemple d'utilisation de la méthode select()</title>
  65. <programlisting language="php"><![CDATA[
  66. $db = Zend_Db::factory( ...options... );
  67. $select = $db->select();
  68. ]]></programlisting>
  69. </example>
  70. <para>
  71. Une autre manière de créer un objet <classname>Zend_Db_Select</classname> est avec
  72. son constructeur, en indiquant l'adaptateur de base de données comme argument.
  73. </para>
  74. <example id="zend.db.select.creating.example-new">
  75. <title>Exemple de création d'un nouvel objet Select</title>
  76. <programlisting language="php"><![CDATA[
  77. $db = Zend_Db::factory( ...options... );
  78. $select = new Zend_Db_Select($db);
  79. ]]></programlisting>
  80. </example>
  81. </sect2>
  82. <sect2 id="zend.db.select.building">
  83. <title>Construction de requêtes Select</title>
  84. <para>
  85. En construisant la requête, vous pouvez ajouter des clauses à la requête une par
  86. une. Il y a une méthode séparée pour ajouter chaque clause à l'objet
  87. <classname>Zend_Db_Select</classname>.
  88. </para>
  89. <example id="zend.db.select.building.example">
  90. <title>Exemple d'utilisation des méthodes d'ajout de clauses</title>
  91. <programlisting language="php"><![CDATA[
  92. // Créer un objet Zend_Db_Select
  93. $select = $db->select();
  94. // Ajouter une clause FROM
  95. $select->from( ...spécifiez une table et des colonnes... )
  96. // Ajouter une clause WHERE
  97. $select->where( ...spécifiez des critères de recherche... )
  98. // Ajouter une clause ORDER BY
  99. $select->order( ...spécifiez des critères de tri... );
  100. ]]></programlisting>
  101. </example>
  102. <para>
  103. Vous pouvez également employer la plupart des méthodes de l'objet Zend_Db_Select
  104. avec une interface fluide et simple. Une <ulink
  105. url="http://en.wikipedia.org/wiki/Fluent_interface">interface fluide</ulink> signifie
  106. que chaque méthode renvoie une référence à l'objet qui a été appelé, ainsi vous pouvez
  107. immédiatement appeler une autre méthode.
  108. </para>
  109. <example id="zend.db.select.building.example-fluent">
  110. <title>Exemple d'utilisation de l'interface fluide</title>
  111. <programlisting language="php"><![CDATA[
  112. $select = $db->select()
  113. ->from( ...spécifiez une table et des colonnes... )
  114. ->where( ...spécifiez des critères de recherche... )
  115. ->order( ...spécifiez des critères de tri... );
  116. ]]></programlisting>
  117. </example>
  118. <para>
  119. Les exemples de cette section montrent l'utilisation de l'interface fluide, mais
  120. vous pouvez employer une interface non-fluide dans tous les cas. Il est souvent
  121. nécessaire d'employer l'interface non-fluide, par exemple, si votre application doit
  122. exécuter de la logique avant d'ajouter une clause à une requête.
  123. </para>
  124. <sect3 id="zend.db.select.building.from">
  125. <title>Ajouter une clause FROM</title>
  126. <para>
  127. Indiquez la table pour la requête en utilisant la méthode <methodname>from()</methodname>.
  128. Vous pouvez indiquer le nom de table comme une chaîne de caractères.
  129. <classname>Zend_Db_Select</classname> applique l'échappement des identificateurs
  130. autour du nom de table, ainsi vous pouvez employer les caractères spéciaux.
  131. </para>
  132. <example id="zend.db.select.building.from.example">
  133. <title>Exemple d'utilisation de la méthode from()</title>
  134. <programlisting language="php"><![CDATA[
  135. // Construire cette requête :
  136. // SELECT *
  137. // FROM "produits"
  138. $select = $db->select()
  139. ->from( 'produits' );
  140. ]]></programlisting>
  141. </example>
  142. <para>
  143. Vous pouvez également indiquer le nom de corrélation (parfois appelé "l'alias
  144. de table") pour une table. Au lieu d'une chaîne de caractère simple, employez un
  145. tableau associatif faisant correspondre le nom de corrélation au nom de table. Dans
  146. d'autres clauses de la requête <acronym>SQL</acronym>, employez ce nom de corrélation. Si votre requête
  147. réalise des jointures sur plus d'une table, <classname>Zend_Db_Select</classname>
  148. produit des noms uniques de corrélation basés sur les noms de table, pour chaque
  149. table pour lesquelles vous n'indiquez pas le nom de corrélation.
  150. </para>
  151. <example id="zend.db.select.building.from.example-cname">
  152. <title>Exemple d'utilisation d'un alias de nom de table</title>
  153. <programlisting language="php"><![CDATA[
  154. // Construire cette requête :
  155. // SELECT p.*
  156. // FROM "produits" AS p
  157. $select = $db->select()
  158. ->from( array('p' => 'produits') );
  159. ]]></programlisting>
  160. </example>
  161. <para>
  162. Certaines marques de SGBDR supportent un spécificateur de schéma principal
  163. pour une table. Vous pouvez spécifiez un nom de table comme
  164. "<code>nomDuSchema.nomDeTable</code>", où <classname>Zend_Db_Select</classname>
  165. échappera chaque partie individuellement, ou vous pouvez spécifier le nom du schéma
  166. séparément. Un nom de schéma spécifié dans le nom de table sera prioritaire sur un
  167. schéma fourni séparément dans les cas où les deux seraient fournis.
  168. </para>
  169. <example id="zend.db.select.building.from.example-schema">
  170. <title>Exemple d'utilisation d'un nom de schéma</title>
  171. <programlisting language="php"><![CDATA[
  172. // Construire cette requête :
  173. // SELECT *
  174. // FROM "monschema"."produits"
  175. $select = $db->select()
  176. ->from( 'monschema.produits' );
  177. // ou
  178. $select = $db->select()
  179. ->from('produits', '*', 'monschema');
  180. ]]></programlisting>
  181. </example>
  182. </sect3>
  183. <sect3 id="zend.db.select.building.columns">
  184. <title>Ajouter des colonnes</title>
  185. <para>
  186. Dans le deuxième argument de la méthode <methodname>from()</methodname>, vous pouvez
  187. indiquer les colonnes à choisir parmi les tables respectives. Si vous n'indiquez
  188. aucune colonne, la valeur par défaut est "<code>*</code>", la caractère de
  189. remplacement <acronym>SQL</acronym> pour "toutes les colonnes".
  190. </para>
  191. <para>
  192. Vous pouvez énumérer les colonnes dans un tableau simple de chaîne de
  193. caractère, ou en tant que tableau associatif faisant correspondre l'alias de la
  194. colonne au nom de la colonne. Si vous avez seulement une colonne à requêter, et vous
  195. n'avez pas besoin d'indiquer un alias de colonne, vous pouvez l'énumérer comme une
  196. chaîne simple au lieu d'un tableau.
  197. </para>
  198. <para>
  199. Si vous passez un tableau comme argument pour les colonnes, aucune colonne
  200. pour la table correspondante ne sera inclus dans le jeu de résultat. Voir un <link
  201. linkend="zend.db.select.building.join.example-no-columns">exemple de code</link>
  202. sous la section concernant la méthode <methodname>join()</methodname>.
  203. </para>
  204. <para>
  205. Vous pouvez indiquer le nom de colonne en tant que
  206. "<code>aliasDeTable.nomDeColonne</code>". <classname>Zend_Db_Select</classname>
  207. échappera chaque partie individuellement. Si vous n'indiquez pas un nom d'alias pour
  208. une colonne, elle emploie le nom de corrélation de la table nommée dans la méthode
  209. courante <methodname>from()</methodname>.
  210. </para>
  211. <example id="zend.db.select.building.columns.example">
  212. <title>Exemples de spécification de colonnes</title>
  213. <programlisting language="php"><![CDATA[
  214. // Construire cette requête :
  215. // SELECT p."produit_id", p."produit_nom"
  216. // FROM "produits" AS p
  217. $select = $db->select()
  218. ->from(array('p' => 'produits'),
  219. array('produit_id', 'produit_nom'));
  220. // Construire la même requête, en spécifiant l'alias de table :
  221. // SELECT p."produit_id", p."produit_nom"
  222. // FROM "produits" AS p
  223. $select = $db->select()
  224. ->from(array('p' => 'produits'),
  225. array('p.produit_id', 'p.produit_nom'));
  226. // Construire cette requête avec un alias pour une colonne :
  227. // SELECT p."produit_id" AS prodno, p."produit_nom"
  228. // FROM "produits" AS p
  229. $select = $db->select()
  230. ->from(array('p' => 'produits'),
  231. array('prodno' => 'produit_id', 'produit_nom'));
  232. ]]></programlisting>
  233. </example>
  234. </sect3>
  235. <sect3 id="zend.db.select.building.columns-expr">
  236. <title>Ajouter une expression de colonne</title>
  237. <para>
  238. Les colonnes dans les requêtes <acronym>SQL</acronym> sont parfois des expressions, pas
  239. simplement des noms de colonnes d'une table. Les expressions peuvent avoir des noms
  240. d'alias ou peuvent nécessiter d'être échappées. Si la chaîne de caractère désignant
  241. votre colonne contient des parenthèses, <classname>Zend_Db_Select</classname> la
  242. reconnaît comme une expression.
  243. </para>
  244. <para>
  245. Vous pouvez aussi créer un objet de type <classname>Zend_Db_Expr</classname>
  246. explicitement, pour éviter qu'une chaîne soit traitée comme un nom de colonne.
  247. <classname>Zend_Db_Expr</classname> est une classe minimale qui contient une unique
  248. chaîne de caractère. <classname>Zend_Db_Select</classname> reconnaît les objets de
  249. type <classname>Zend_Db_Expr</classname> et les convertit en chaînes de caractères,
  250. mais n'applique aucun changement, tel qu'un échappement ou un alias.
  251. </para>
  252. <note>
  253. <para>
  254. Utiliser <classname>Zend_Db_Expr</classname> pour les noms de colonnes
  255. n'est pas nécessaire si votre expression de colonne contient des parenthèses ;
  256. <classname>Zend_Db_Select</classname> reconnaît les parenthèses et traite la
  257. chaîne comme une expression en omettant l'échappement et les alias.
  258. </para>
  259. </note>
  260. <example id="zend.db.select.building.columns-expr.example">
  261. <title>Exemples d'utilisation de colonnes contenant des expressions</title>
  262. <programlisting language="php"><![CDATA[
  263. // Construire cette requête :
  264. // SELECT p."produit_id", LOWER(produit_nom)
  265. // FROM "produits" AS p
  266. // Une expression avec parenthèses devient implicitement
  267. // un objet Zend_Db_Expr.
  268. $select = $db->select()
  269. ->from(array('p' => 'produits'),
  270. array('produit_id', 'LOWER(produit_nom)'));
  271. // Construire cette requête :
  272. // SELECT p."produit_id", (p.prix * 1.08) AS prix_avec_taxe
  273. // FROM "produits" AS p
  274. $select = $db->select()
  275. ->from(array('p' => 'produits'),
  276. array('produit_id',
  277. 'prix_avec_taxe' => '(p.prix * 1.08)'));
  278. // Construire cette requête en utilisant explicitement Zend_Db_Expr :
  279. // SELECT p."produit_id", p.prix * 1.08 AS prix_avec_taxe
  280. // FROM "produits" AS p
  281. $select = $db->select()
  282. ->from(array('p' => 'produits'),
  283. array('produit_id',
  284. 'prix_avec_taxe' =>
  285. new Zend_Db_Expr('p.prix * 1.08')));
  286. ]]></programlisting>
  287. </example>
  288. <para>
  289. Dans les cas ci-dessus, <classname>Zend_Db_Select</classname> ne change pas la
  290. chaîne pour appliquer des alias ou échapper les identificateurs. Si ces changements
  291. sont nécessaires pour résoudre l'ambiguïté, vous devez faire manuellement les
  292. changements dans la chaîne de caractères.
  293. </para>
  294. <para>
  295. Si vos noms de colonne sont des mots-clés de <acronym>SQL</acronym> ou contiennent les caractères
  296. spéciaux, vous devriez employer la méthode <methodname>quoteIdentifier()</methodname> de
  297. l'adaptateur et interpoler le résultat dans la chaîne de caractères. La méthode
  298. <methodname>quoteIdentifier()</methodname> utilise l'échappement <acronym>SQL</acronym> pour délimiter les
  299. identificateurs, qui indique clairement que c'est un identificateur pour une table
  300. ou une colonne, et non n'importe quelle autre partie de la syntaxe de <acronym>SQL</acronym>.
  301. </para>
  302. <para>
  303. Votre code est plus indépendant du SGBDR si vous utilisez la méthode
  304. <methodname>quoteIdentifier()</methodname> au lieu d'échapper littéralement dans votre chaîne,
  305. car quelques marques de SGBDR utilisent des symboles non standards pour échapper les
  306. identificateurs. La méthode <methodname>quoteIdentifier()</methodname> est conçue pour utiliser
  307. le symbole d'échappement approprié basé sur le type d'adaptateur. La méthode
  308. <methodname>quoteIdentifier()</methodname> échappe aussi tout caractère d'échappement qui
  309. apparaissent dans l'identificateur lui-même.
  310. </para>
  311. <example id="zend.db.select.building.columns-quoteid.example">
  312. <title>Exemples d'échappement de colonnes dans une expression</title>
  313. <programlisting language="php"><![CDATA[
  314. // Construire cette requête, en échappant une colonne spéciale
  315. // nommée "from" dans une expression :
  316. // SELECT p."from" + 10 AS origine
  317. // FROM "produits" AS p
  318. $select = $db->select()
  319. ->from(array('p' => 'produits'),
  320. array('origine' => '(p.'
  321. . $db->quoteIdentifier('from')
  322. . ' + 10)'));
  323. ]]></programlisting>
  324. </example>
  325. </sect3>
  326. <sect3 id="zend.db.select.building.columns-atomic">
  327. <title>Ajouter des colonnes à une table FROM ou JOIN existante</title>
  328. <para>
  329. Il peut y avoir des cas où vous souhaitez ajouter des colonnes à une table
  330. FROM ou JOIN existante après que ces méthodes aient été appelées. La méthode
  331. <methodname>columns()</methodname> vous permet d'ajouter des colonnes spécifiques à n'importe
  332. quel moment avant que la requête ne soit exécutée. Vous pouvez fournir les colonnes
  333. en tant qu'une chaîne de caractères, une <classname>Zend_Db_Expr</classname> ou un
  334. tableau de ces derniers. Le second argument de cette méthode peut être omis,
  335. impliquant que les colonnes sont ajoutées à la table FROM, sinon un alias déjà
  336. défini doit être utilisé.
  337. </para>
  338. <example id="zend.db.select.building.columns-atomic.example">
  339. <title>Exemples d'ajout de colonnes avec la méthode
  340. <methodname>columns()</methodname></title>
  341. <programlisting language="php"><![CDATA[
  342. // Construire cette requête :
  343. // SELECT p."produit_id", p."produit_nom"
  344. // FROM "produits" AS p
  345. $select = $db->select()
  346. ->from(array('p' => 'produits'), 'produit_id')
  347. ->columns('produit_nom');
  348. // Construire la même requête, en spécifiant l'alias :
  349. // SELECT p."produit_id", p."produit_nom"
  350. // FROM "produits" AS p
  351. $select = $db->select()
  352. ->from(array('p' => 'produits'), 'p.produit_id')
  353. ->columns('produit_nom', 'p');
  354. // Ou alternativement columns('p.produit_nom')
  355. ]]></programlisting>
  356. </example>
  357. </sect3>
  358. <sect3 id="zend.db.select.building.join">
  359. <title>Ajouter une autre table à la requête avec JOIN</title>
  360. <para>
  361. Beaucoup de requêtes utiles impliquent l'utilisation de <constant>JOIN</constant> pour
  362. combiner les lignes issues de tables multiples. Vous pouvez ajouter des tables à une
  363. requête en utilisant la méthode <methodname>join()</methodname>. L'utilisation de cette méthode
  364. est similaire à la méthode <methodname>from()</methodname>, excepté que vous pouvez aussi
  365. spécifier une condition join dans la plupart des cas.
  366. </para>
  367. <example id="zend.db.select.building.join.example">
  368. <title>Exemple d'utilisation de la méthode join()</title>
  369. <programlisting language="php"><![CDATA[
  370. // Construire cette requête :
  371. // SELECT p."produit_id", p."produit_nom", l.*
  372. // FROM "produits" AS p JOIN "ligne_items" AS l
  373. // ON p.produit_id = l.produit_id
  374. $select = $db->select()
  375. ->from(array('p' => 'produits'),
  376. array('produit_id', 'produit_nom'))
  377. ->join(array('l' => 'ligne_items'),
  378. 'p.produit_id = l.produit_id');
  379. ]]></programlisting>
  380. </example>
  381. <para>
  382. Le deuxième argument de <methodname>join()</methodname> est une chaîne qui représente la
  383. condition join. C'est une expression qui déclare les critères par lesquels les
  384. lignes d'une table correspondent aux lignes dans une autre table. Vous pouvez
  385. utiliser un nom d'alias dans cette expression.
  386. </para>
  387. <note>
  388. <para>
  389. Aucun échappement n'est appliqué à une expression que vous spécifiez pour
  390. une condition join&#160;; si vous avez des noms de colonnes qui nécessitent
  391. d'être échappées, vous devez utiliser <methodname>quoteIdentifier()</methodname> quand vous
  392. préparez la chaîne pour une condition join.
  393. </para>
  394. </note>
  395. <para>
  396. Le troisième argument de <methodname>join()</methodname> est un tableau des noms de
  397. colonnes, comme c'est utilisé dans la méthode <methodname>from()</methodname>. La valeur par
  398. défaut est "<code>*</code>", la méthode supporte les alias, les expressions, et les
  399. objets <classname>Zend_Db_Expr</classname> de la même manière que le tableau de noms
  400. de colonnes de la méthode <methodname>from()</methodname>.
  401. </para>
  402. <para>
  403. Pour ne choisir aucune colonne à partir d'une table, utilisez un tableau vide
  404. pour la liste de colonnes. Cette utilisation fonctionnerait aussi avec la méthode
  405. <methodname>from()</methodname>, mais typiquement vous pouvez avoir besoin de colonnes issues de
  406. la table primaire dans vos requêtes, tandis que vous pourriez ne vouloir aucune
  407. colonne de la table jointe.
  408. </para>
  409. <example id="zend.db.select.building.join.example-no-columns">
  410. <title>Exemple avec aucune colonne spécifiée</title>
  411. <programlisting language="php"><![CDATA[
  412. // Construire cette requête :
  413. // SELECT p."produit_id", p."produit_nom"
  414. // FROM "produits" AS p JOIN "ligne_items" AS l
  415. // ON p.produit_id = l.produit_id
  416. $select = $db->select()
  417. ->from(array('p' => 'produits'),
  418. array('produit_id', 'produit_name'))
  419. ->join(array('l' => 'ligne_items'),
  420. 'p.produit_id = l.produit_id',
  421. array() ); // liste de colonnes vide
  422. ]]></programlisting>
  423. <para>
  424. Notez le tableau vide (<methodname>array()</methodname>) dans l'exemple ci-dessus à la
  425. place de la liste de colonnes de la table jointe.
  426. </para>
  427. </example>
  428. <para>
  429. Le <acronym>SQL</acronym> a plusieurs types de jointures. Voyez la liste ci-dessous des méthodes
  430. supportant les différents types de jointures dans
  431. <classname>Zend_Db_Select</classname>.
  432. </para>
  433. <itemizedlist>
  434. <listitem>
  435. <para>
  436. <command>INNER JOIN</command> avec les méthodes <code>join(table,
  437. jointure, [colonnes])</code> ou <code>joinInner(table, jointure,
  438. [colonnes])</code>.
  439. </para>
  440. <para>
  441. Ceci est le type de jointure le plus commun. Les lignes de chaque
  442. table sont comparées en utilisant la condition join spécifiée. Le résultat
  443. inclut seulement les lignes qui vérifient la condition join. Le résultat
  444. peut être vide si aucune ligne ne satisfait la condition.
  445. </para>
  446. <para>Tous les marques de SGBDR supportent ce type de jointure.</para>
  447. </listitem>
  448. <listitem>
  449. <para>
  450. <command>LEFT JOIN</command> avec la méthode <code>joinLeft(table,
  451. condition, [colonnes])</code>.
  452. </para>
  453. <para>
  454. Toutes les lignes issues de la table opérande de gauche sont inclues,
  455. les lignes correspondantes de la table de droite sont inclues, et les
  456. colonnes de la table opérande de droite sont remplies de NULL si aucune
  457. ligne existante ne correspond à la table de gauche.
  458. </para>
  459. <para>Tous les marques de SGBDR supportent ce type de jointure.</para>
  460. </listitem>
  461. <listitem>
  462. <para>
  463. <command>RIGHT JOIN</command> avec la méthode <code>joinRight(table,
  464. condition, [colonnes])</code>.
  465. </para>
  466. <para>
  467. La jointure étrangère droite est le complément de la jointure
  468. étrangère gauche. Toutes les lignes issues de la table opérande de droite
  469. sont inclues, les lignes correspondantes de la table de gauche sont inclues,
  470. et les colonnes de la table opérande de gauche sont remplies de NULL si
  471. aucune ligne existante ne correspond à la table de droite.
  472. </para>
  473. <para>
  474. Certaines marques de SGBDR ne supportent pas ce type de jointure, mais
  475. en général toute jointure droite peut être représentée comme une jointure
  476. gauche en inversant l'ordre des tables.
  477. </para>
  478. </listitem>
  479. <listitem>
  480. <para>
  481. <command>FULL JOIN</command> avec la méthode <code>joinFull(table,
  482. condition, [colonnes])</code>.
  483. </para>
  484. <para>
  485. Une jointure étrangère complète est comme la combinaison d'une
  486. jointure étrangère gauche et d'une jointure étrangère droite. Toutes les
  487. lignes des deux tables sont inclues, appairées ensemble dans la même ligne
  488. de résultat si elles satisfont la condition de jointure, et sinon appairées
  489. avec des valeurs NULL à la place des colonnes de l'autre table.
  490. </para>
  491. <para>
  492. Certaines marques de SGBDR ne supportent pas ce type de
  493. jointure.
  494. </para>
  495. </listitem>
  496. <listitem>
  497. <para>
  498. <command>CROSS JOIN</command> avec la méthode <code>joinCross(table,
  499. [colonnes])</code>.
  500. </para>
  501. <para>
  502. Une jointure croisée est un produit cartésien. Chaque ligne de la
  503. première table est assortie avec chaque ligne de la seconde. Ainsi le nombre
  504. de lignes du résultat est équivalent au produit du nombre de lignes de
  505. chacune des tables. Vous pouvez filtrer le résultat en utilisant une clause
  506. WHERE ; dans ce cas une jointure croisée est semblable à l'ancienne syntaxe
  507. de jointure SQL-89.
  508. </para>
  509. <para>
  510. La méthode <methodname>joinCross()</methodname> n'a pas de paramètres pour
  511. spécifier la condition de jointure. Certaines marques de SGBDR ne supportent
  512. pas ce type de jointure.
  513. </para>
  514. </listitem>
  515. <listitem>
  516. <para>
  517. <command>NATURAL JOIN</command> avec la méthode
  518. <methodname>joinNatural(table, [colonnes])</methodname>.
  519. </para>
  520. <para>
  521. Une jointure naturelle compare chaque(s) colonne(s) qui apparaissent
  522. avec le même nom dans les deux tables. La comparaison est l'égalité pour
  523. toute(s) la(es) colonne(s) ; la comparaison des colonnes utilisant
  524. l'inégalité n'est pas une jointure naturelle. Seules les jointures internes
  525. (NdT : INNER) naturelles sont supportées par cette <acronym>API</acronym>, même si la syntaxe
  526. <acronym>SQL</acronym> permet aussi bien des jointures naturelles étrangères (NdT :
  527. OUTER).
  528. </para>
  529. <para>
  530. La méthode <methodname>joinNatural()</methodname> n'a pas de paramètres pour
  531. spécifier la condition de jointure.
  532. </para>
  533. </listitem>
  534. </itemizedlist>
  535. <para>
  536. En plus de ces méthodes join, vous pouvez simplifier vos requêtes en utilisant
  537. les méthodes de type <code>join*Using</code>. Au lieu de fournir une condition
  538. complète à votre jointure, vous fournissez simplement le nom de la colonne sur
  539. laquelle réaliser la jointure et l'objet <classname>Zend_Db_Select</classname>
  540. complète la condition pour vous.
  541. </para>
  542. <example id="zend.db.select.building.joinusing.example">
  543. <title>Exemple avec la méthode <methodname>joinUsing()</methodname></title>
  544. <programlisting language="php"><![CDATA[
  545. // Construire cette requête :
  546. // SELECT *
  547. // FROM "table1"
  548. // JOIN "table2"
  549. // ON "table1".colonne1 = "table2".colonne1
  550. // WHERE colonne2 = 'foo'
  551. $select = $db->select()
  552. ->from('table1')
  553. ->joinUsing('table2', 'colonne1')
  554. ->where('column2 = ?', 'foo');
  555. ]]></programlisting>
  556. </example>
  557. <para>
  558. Chacune des méthodes join applicables du composant
  559. <classname>Zend_Db_Select</classname> possède une méthode correspondante
  560. "using".
  561. </para>
  562. <itemizedlist>
  563. <listitem>
  564. <para>
  565. <methodname>joinUsing(table, join, [columns])</methodname> et
  566. <methodname>joinInnerUsing(table, join, [columns])</methodname>
  567. </para>
  568. </listitem>
  569. <listitem>
  570. <para><methodname>joinLeftUsing(table, join, [columns])</methodname></para>
  571. </listitem>
  572. <listitem>
  573. <para><methodname>joinRightUsing(table, join, [columns])</methodname></para>
  574. </listitem>
  575. <listitem>
  576. <para><methodname>joinFullUsing(table, join, [columns])</methodname></para>
  577. </listitem>
  578. </itemizedlist>
  579. </sect3>
  580. <sect3 id="zend.db.select.building.where">
  581. <title>Ajouter une clause WHERE</title>
  582. <para>
  583. Vous pouvez spécifier des critères pour restreindre le nombre de lignes du
  584. résultat en utilisant la méthode <methodname>where()</methodname>. Le premier argument de cette
  585. méthode est une expression <acronym>SQL</acronym>, et cette expression est utilisée dans une clause
  586. <constant>WHERE</constant> dans la requête.
  587. </para>
  588. <example id="zend.db.select.building.where.example">
  589. <title>Exemple d'utilisation de la méthode where()</title>
  590. <programlisting language="php"><![CDATA[
  591. // Construire cette requête :
  592. // SELECT produit_id, produit_nom, prix
  593. // FROM "produits"
  594. // WHERE prix > 100.00
  595. $select = $db->select()
  596. ->from('produits',
  597. array('produit_id', 'produit_nom', 'prix'))
  598. ->where('prix > 100.00');
  599. ]]></programlisting>
  600. </example>
  601. <note>
  602. <para>
  603. Aucun échappement n'est appliqué aux expressions passées aux méthodes
  604. <methodname>where()</methodname> ou <methodname>orWhere()</methodname>. Si vous avez des noms de
  605. colonnes qui nécessitent d'être échappés, vous devez utiliser
  606. <methodname>quoteIdentifier()</methodname> quand vous générez la chaîne pour la
  607. condition.
  608. </para>
  609. </note>
  610. <para>
  611. Le second argument de la méthode <methodname>where()</methodname> est optionnel. C'est une
  612. valeur à substituer dans l'expression. <classname>Zend_Db_Select</classname> échappe
  613. cette valeur et la substitue au caractère point ("<code>?</code>") d'interrogation
  614. dans l'expression.
  615. </para>
  616. <example id="zend.db.select.building.where.example-param">
  617. <title>Exemple d'un paramètre dans la méthode where()</title>
  618. <programlisting language="php"><![CDATA[
  619. // Construire cette requête :
  620. // SELECT produit_id, produit_nom, prix
  621. // FROM "produits"
  622. // WHERE (prix > 100.00)
  623. $prixminimum = 100;
  624. $select = $db->select()
  625. ->from('produits',
  626. array('produit_id', 'produit_nom', 'prix'))
  627. ->where('prix > ?', $prixminimum);
  628. ]]></programlisting>
  629. </example>
  630. <para>
  631. Vous pouvez fournir un tableau en tant que second paramètre de la méthode
  632. <methodname>where()</methodname> quand vous utilisez l'opérateur SQL "IN".
  633. </para>
  634. <example id="zend.db.select.building.where.example-array">
  635. <title>Exemple d'un paramètre de type tableau pour la méthode where()</title>
  636. <programlisting language="php"><![CDATA[
  637. // Construire cette requête :
  638. // SELECT produit_id, produit_nom, prix
  639. // FROM "produits"
  640. // WHERE (produit_id IN (1, 2, 3))
  641. $productIds = array(1, 2, 3);
  642. $select = $db->select()
  643. ->from('produits',
  644. array('produit_id', 'produit_nom', 'prix'))
  645. ->where('produit_id IN (?)', $productIds);
  646. ]]></programlisting>
  647. </example>
  648. <para>
  649. Vous pouvez appeler la méthode <methodname>where()</methodname> plusieurs fois sur la même
  650. objet <classname>Zend_Db_Select</classname>. La requête résultante combine les
  651. différents termes ensemble en utilisant <constant>AND</constant> entre eux.
  652. </para>
  653. <example id="zend.db.select.building.where.example-and">
  654. <title>Exemple avec plusieurs appels de where()</title>
  655. <programlisting language="php"><![CDATA[
  656. // Construire cette requête :
  657. // SELECT produit_id, produit_nom, prix
  658. // FROM "produits"
  659. // WHERE (prix > 100.00)
  660. // AND (prix < 500.00)
  661. $prixminimum = 100;
  662. $prixmaximum = 500;
  663. $select = $db->select()
  664. ->from('produits',
  665. array('produit_id', 'produit_nom', 'prix'))
  666. ->where('prix > ?', $prixminimum)
  667. ->where('prix < ?', $prixmaximum);
  668. ]]></programlisting>
  669. </example>
  670. <para>
  671. Si vous devez combiner ensemble des termes en utilisant <code>OR</code>,
  672. utilisez la méthode <methodname>orWhere()</methodname>. Cette méthode est utilisée de la même
  673. manière que la méthode <methodname>where()</methodname>, excepté que le terme spécifié est
  674. précédé par <code>OR</code>, au lieu de <constant>AND</constant>.
  675. </para>
  676. <example id="zend.db.select.building.where.example-or">
  677. <title>Exemple d'utilisation de la méthode orWhere()</title>
  678. <programlisting language="php"><![CDATA[
  679. // Construire cette requête :
  680. // SELECT produit_id, produit_nom, prix
  681. // FROM "produits"
  682. // WHERE (prix < 100.00)
  683. // OR (prix > 500.00)
  684. $prixminimum = 100;
  685. $prixmaximum = 500;
  686. $select = $db->select()
  687. ->from('produits',
  688. array('produit_id', 'produit_nom', 'prix'))
  689. ->where('prix < ?', $prixminimum)
  690. ->orWhere('prix > ?', $prixmaximum);
  691. ]]></programlisting>
  692. </example>
  693. <para>
  694. <classname>Zend_Db_Select</classname> met automatiquement des parenthèses
  695. autour de chaque expression spécifiée en utilisant les méthodes <methodname>where()</methodname>
  696. ou <methodname>orWhere()</methodname>. Ceci permet de s'assurer que la priorité de l'opérateur
  697. booléen n'entraîne pas de résultats inattendus.
  698. </para>
  699. <example id="zend.db.select.building.where.example-parens">
  700. <title>Exemple de mise en parenthèse d'expressions booléennes</title>
  701. <programlisting language="php"><![CDATA[
  702. // Construire cette requête :
  703. // SELECT produit_id, produit_nom, prix
  704. // FROM "produits"
  705. // WHERE (prix < 100.00 OR prix > 500.00)
  706. // AND (produit_nom = 'Pomme')
  707. $prixminimum = 100;
  708. $prixmaximum = 500;
  709. $prod = 'Pomme';
  710. $select = $db->select()
  711. ->from('produits',
  712. array('produit_id', 'produit_nom', 'prix'))
  713. ->where("prix < $prixminimum OR prix > $prixmaximum")
  714. ->where('produit_nom = ?', $prod);
  715. ]]></programlisting>
  716. </example>
  717. <para>
  718. Dans l'exemple ci-dessus, le résultat serait tout à fait différent sans
  719. parenthèses, car <constant>AND</constant> a une plus grande priorité que <code>OR</code>.
  720. <classname>Zend_Db_Select</classname> applique les parenthèses avec pour effet de
  721. relier de manière plus étroite chaque expression dans les appels successifs de
  722. <methodname>where()</methodname> qu'avec <constant>AND</constant> qui combine les expressions.
  723. </para>
  724. </sect3>
  725. <sect3 id="zend.db.select.building.group">
  726. <title>Ajouter une clause GROUP BY</title>
  727. <para>
  728. Dans la syntaxe <acronym>SQL</acronym>, la clause <code>GROUP BY</code> vous permet de réduire le
  729. nombre de lignes du résultat de la requête à une ligne par valeur unique trouvé dans
  730. une(des) colonne(s) nommées) dans la clause <code>GROUP BY</code>.
  731. </para>
  732. <para>
  733. Dans <classname>Zend_Db_Select</classname>, vous pouvez spécifier la(es)
  734. colonne(s) à utiliser pour calculer les groupes de lignes en utilisant la méthode
  735. <methodname>group()</methodname>. L'argument de cette méthode est une colonne ou un tableau de
  736. colonnes à utiliser dans la clause <code>GROUP BY</code>.
  737. </para>
  738. <example id="zend.db.select.building.group.example">
  739. <title>Exemple d'utilisation de la méthode group()</title>
  740. <programlisting language="php"><![CDATA[
  741. // Construire cette requête :
  742. // SELECT p."produit_id", COUNT(*) AS ligne_items_par_produit
  743. // FROM "produits" AS p JOIN "ligne_items" AS l
  744. // ON p.produit_id = l.produit_id
  745. // GROUP BY p.produit_id
  746. $select = $db->select()
  747. ->from(array('p' => 'produits'),
  748. array('produit_id'))
  749. ->join(array('l' => 'ligne_items'),
  750. 'p.produit_id = l.produit_id',
  751. array('ligne_items_par_produit' => 'COUNT(*)'))
  752. ->group('p.produit_id');
  753. ]]></programlisting>
  754. </example>
  755. <para>
  756. Comme le tableau de colonnes de la méthode <methodname>from()</methodname>, vous pouvez
  757. utiliser des noms d'alias dans le nom de la colonne, et la colonne est échappée
  758. comme un identificateur à moins que la chaîne ne contiennent des parenthèses ou que
  759. ce soit un objet de type <classname>Zend_Db_Expr</classname>.
  760. </para>
  761. </sect3>
  762. <sect3 id="zend.db.select.building.having">
  763. <title>Ajouter une clause HAVING</title>
  764. <para>
  765. Dans la syntaxe <acronym>SQL</acronym>, la clause <constant>HAVING</constant> applique une restriction
  766. sur un groupe de lignes. Ceci est similaire à la manière dont la clause
  767. <constant>WHERE</constant> applique une restriction sur des lignes. Mais les deux clauses
  768. sont différentes car les conditions <constant>WHERE</constant> sont appliquées avant que les
  769. groupes de lignes ne soient définis, alors que les conditions <constant>HAVING</constant>
  770. sont appliquées après que les groupes aient été définis.
  771. </para>
  772. <para>
  773. Dans <classname>Zend_Db_Select</classname>, vous pouvez spécifier des
  774. conditions pour restreindre des groupes en utilisant la méthode
  775. <methodname>having()</methodname>. Son utilisation est similaire à celle de la méthode
  776. <methodname>where()</methodname>. Le premier argument est une chaîne contenant une expression
  777. <acronym>SQL</acronym>. Le second argument facultatif est une valeur qui est utilisé pour remplacer le
  778. caractère de substitution positionné dans l'expression <acronym>SQL</acronym>. Les expressions passées
  779. dans de multiples appels de la méthode <methodname>having()</methodname> sont combinées en
  780. utilisant l'opérateur booléen <constant>AND</constant>, ou l'opérateur <code>OR</code> si
  781. vous utilisez la méthode <methodname>orHaving()</methodname>.
  782. </para>
  783. <example id="zend.db.select.building.having.example">
  784. <title>Exemple d'utilisation de la méthode having()</title>
  785. <programlisting language="php"><![CDATA[
  786. // Construire cette requête :
  787. // SELECT p."produit_id", COUNT(*) AS ligne_items_par_produit
  788. // FROM "produits" AS p JOIN "ligne_items" AS l
  789. // ON p.produit_id = l.produit_id
  790. // GROUP BY p.produit_id
  791. // HAVING ligne_items_par_produit > 10
  792. $select = $db->select()
  793. ->from(array('p' => 'produits'),
  794. array('produit_id'))
  795. ->join(array('l' => 'ligne_items'),
  796. 'p.produit_id = l.produit_id',
  797. array('ligne_items_par_produit' => 'COUNT(*)'))
  798. ->group('p.produit_id')
  799. ->having('ligne_items_par_produit > 10');
  800. ]]></programlisting>
  801. </example>
  802. <note>
  803. <para>
  804. Aucun échappement n'est appliqué aux expressions fournies aux méthodes
  805. <methodname>having()</methodname> ou <methodname>orHaving()</methodname>. Si vous avez des noms de
  806. colonnes qui nécessitent d'être échappées, vous devez utiliser
  807. <methodname>quoteIdentifier()</methodname> quand vous générez la chaîne de cette
  808. condition.
  809. </para>
  810. </note>
  811. </sect3>
  812. <sect3 id="zend.db.select.building.order">
  813. <title>Ajouter une clause ORDER BY</title>
  814. <para>
  815. Dans la syntaxe <acronym>SQL</acronym>, la clause <code>ORDER BY</code> spécifie une ou plusieurs
  816. colonnes ou expressions suivant lesquelles le résultat d'une requête doit être trié.
  817. Si plusieurs colonnes sont listées, les colonnes secondaires sont utilisées pour
  818. résoudre les égalités ; l'ordre du tri est déterminé par les colonnes secondaires si
  819. les colonnes précédentes contiennent des valeurs identiques. Le tri par défaut est
  820. ascendant (du plus petit vers le plus grand). Vous pouvez aussi appliqué un tri
  821. descendant (du plus grand vers le plus petit) pour une colonne en spécifiant le
  822. mot-clé <constant>DESC</constant> après la colonne.
  823. </para>
  824. <para>
  825. Dans <classname>Zend_Db_Select</classname>, vous pouvez utiliser la méthode
  826. <methodname>order()</methodname> pour spécifier une colonne ou un tableau de colonnes par
  827. lesquelles vous voulez trier. Chaque élément du tableau est une chaîne nommant une
  828. colonne, facultativement suivi les mots-clés <constant>ASC</constant> ou <constant>DESC</constant>
  829. en séparant avec un espace.
  830. </para>
  831. <para>
  832. Comme pour les méthodes <methodname>from()</methodname> et <methodname>group()</methodname>, les noms
  833. de colonnes sont échappées comme des identificateurs, à moins qu'elles ne
  834. contiennent des parenthèses ou ne soient des objets de type
  835. <classname>Zend_Db_Expr</classname>.
  836. </para>
  837. <example id="zend.db.select.building.order.example">
  838. <title>Exemple d'utilisation de la méthode order()</title>
  839. <programlisting language="php"><![CDATA[
  840. // Construire cette requête :
  841. // SELECT p."produit_id", COUNT(*) AS ligne_items_par_produit
  842. // FROM "produits" AS p JOIN "ligne_items" AS l
  843. // ON p.produit_id = l.produit_id
  844. // GROUP BY p.produit_id
  845. // ORDER BY "ligne_items_par_produit" DESC, "produit_id"
  846. $select = $db->select()
  847. ->from(array('p' => 'produits'),
  848. array('produit_id'))
  849. ->join(array('l' => 'ligne_items'),
  850. 'p.produit_id = l.produit_id',
  851. array('ligne_items_par_produit' => 'COUNT(*)'))
  852. ->group('p.produit_id')
  853. ->order(array('ligne_items_par_produit DESC',
  854. 'produit_id'));
  855. ]]></programlisting>
  856. </example>
  857. </sect3>
  858. <sect3 id="zend.db.select.building.limit">
  859. <title>Ajouter une clause LIMIT</title>
  860. <para>
  861. Certaines marques de SGBDR étendent la syntaxe <acronym>SQL</acronym> avec une clause
  862. <constant>LIMIT</constant>. Cette clause réduit le nombre de lignes d'un résultat à un
  863. nombre maximum que vous spécifiez. Vous pouvez de plus indiquer un nombre de lignes
  864. à éviter avant de commencer à produire le résultat. Cette fonctionnalité facilite
  865. l'extraction d'un sous-ensemble d'un résultat, par exemple quand vous affichez des
  866. résultats avec un défilement de pages.
  867. </para>
  868. <para>
  869. Dans <classname>Zend_Db_Select</classname>, vous pouvez utiliser la méthode
  870. <methodname>limit()</methodname> pour spécifier le nombre de lignes ainsi que le nombre de
  871. lignes à omettre. Le premier argument de cette méthode est le nombre de lignes
  872. désirées. Le second argument est le nombre de lignes à omettre.
  873. </para>
  874. <example id="zend.db.select.building.limit.example">
  875. <title>Exemple d'utilisation de la méthode limit()</title>
  876. <programlisting language="php"><![CDATA[
  877. // Construire cette requête :
  878. // SELECT p."produit_id", p."produit_nom"
  879. // FROM "produits" AS p
  880. // LIMIT 10, 20
  881. $select = $db->select()
  882. ->from(array('p' => 'produits'),
  883. array('produit_id', 'produit_nom'))
  884. ->limit(10, 20);
  885. ]]></programlisting>
  886. </example>
  887. <note>
  888. <para>
  889. La syntaxe <constant>LIMIT</constant> n'est pas supporté par toutes les marques de
  890. SGBDR. Quelques SGBDR nécessite une syntaxe différente pour supporter une
  891. fonctionnalité similaire. Chaque classe
  892. <classname>Zend_Db_Adapter_Abstract</classname> inclue une méthode pour produire
  893. le code <acronym>SQL</acronym> approprié à ce SGBDR.
  894. </para>
  895. </note>
  896. <para>
  897. Utilisez de manière alternative la méthode <methodname>limitPage()</methodname> pour
  898. spécifier le nombre de lignes et le décalage. Cette méthode vous permet de limiter
  899. le jeu de résultats à une série d'un nombre fixé de résultats issus du jeu total de
  900. résultats de la requête. En d'autres termes, vous spécifiez la taille de la "page"
  901. de résultats, et le nombre ordinal de la page unique de résultats que vous souhaitez
  902. voir retourner par la requête. Le numéro de la page est le premier argument de la
  903. méthode <methodname>limitPage()</methodname>, et la taille de la page est le second argument.
  904. Les deux arguments sont obligatoires ; ils n'ont pas de valeurs par défaut.
  905. </para>
  906. <example id="zend.db.select.building.limit.example2">
  907. <title>Exemple d'utilisation de la méthode limitPage()</title>
  908. <programlisting language="php"><![CDATA[
  909. // Construire cette requête :
  910. // SELECT p."product_id", p."product_name"
  911. // FROM "products" AS p
  912. // LIMIT 10, 20
  913. $select = $db->select()
  914. ->from(array('p' => 'products'),
  915. array('product_id', 'product_name'))
  916. ->limitPage(2, 10);
  917. ]]></programlisting>
  918. </example>
  919. </sect3>
  920. <sect3 id="zend.db.select.building.distinct">
  921. <title>Ajouter le modificateur de requête DISTINCT</title>
  922. <para>
  923. La méthode <methodname>distinct()</methodname> vous permet d'ajouter le mot-clé
  924. <constant>DISTINCT</constant> à votre requête <acronym>SQL</acronym>.
  925. </para>
  926. <example id="zend.db.select.building.distinct.example">
  927. <title>Exemple d'utilisation de la méthode distinct()</title>
  928. <programlisting language="php"><![CDATA[
  929. // Construire cette requête :
  930. // SELECT DISTINCT p."produit_nom"
  931. // FROM "produits" AS p
  932. $select = $db->select()
  933. ->distinct()
  934. ->from(array('p' => 'produits'), 'produit_nom');
  935. ]]></programlisting>
  936. </example>
  937. </sect3>
  938. <sect3 id="zend.db.select.building.for-update">
  939. <title>Ajouter le modificateur de requête FOR UPDATE</title>
  940. <para>
  941. La méthode <methodname>forUpdate()</methodname> vous permet d'ajouter le modificateur
  942. <code>FOR UPDATE</code> à votre requête <acronym>SQL</acronym>.
  943. </para>
  944. <example id="zend.db.select.building.for-update.example">
  945. <title>Exemple d'utilisation de la méthode forUpdate()</title>
  946. <programlisting language="php"><![CDATA[
  947. // Construire cette requête :
  948. // SELECT FOR UPDATE p.*
  949. // FROM "produits" AS p
  950. $select = $db->select()
  951. ->forUpdate()
  952. ->from(array('p' => 'produits'));
  953. ]]></programlisting>
  954. </example>
  955. </sect3>
  956. <sect3 id="zend.db.select.building.union">
  957. <title>Construire une requête UNION</title>
  958. <para>
  959. Vous pouvez construire des requêtes de type union avec
  960. <classname>Zend_Db_Select</classname> en fournissant un tableau de
  961. <classname>Zend_Db_Select</classname> ou de chaînes de requêtes SQL à la méthode
  962. <methodname>union()</methodname>. En second paramètre, vous pouvez fournir les
  963. constantes <constant>Zend_Db_Select::SQL_UNION</constant> ou
  964. <constant>Zend_Db_Select::SQL_UNION_ALL</constant> pour spécifier le type d'union
  965. que vous souhaitez réaliser.
  966. </para>
  967. <example id="zend.db.select.building.union.example">
  968. <title>Exemple avec la méthode union()</title>
  969. <programlisting language="php"><![CDATA[
  970. $sql1 = $db->select();
  971. $sql2 = "SELECT ...";
  972. $select = $db->select()
  973. ->union(array($sql1, $sql2))
  974. ->order("id");
  975. ]]></programlisting>
  976. </example>
  977. </sect3>
  978. </sect2>
  979. <sect2 id="zend.db.select.execute">
  980. <title>Exécuter des requêtes Select</title>
  981. <para>
  982. Cette section décrit comment exécuter une requête représentée par un objet
  983. <classname>Zend_Db_Select</classname>.
  984. </para>
  985. <sect3 id="zend.db.select.execute.query-adapter">
  986. <title>Exécuter des requêtes Select à partir de l'adaptateur Db</title>
  987. <para>
  988. Vous pouvez exécuter la requête représentée par l'objet
  989. <classname>Zend_Db_Select</classname> en le passant comme premier argument de la
  990. méthode <methodname>query()</methodname> d'un objet
  991. <classname>Zend_Db_Adapter_Abstract</classname>. Utilisez les objets
  992. <classname>Zend_Db_Select</classname> plutôt qu'une simple chaîne de requête.
  993. </para>
  994. <para>
  995. La méthode <methodname>query()</methodname> retourne un objet de type
  996. <classname>Zend_Db_Statement</classname> ou <code>PDOStatement</code>, dépendant du
  997. type d'adaptateur.
  998. </para>
  999. <example id="zend.db.select.execute.query-adapter.example">
  1000. <title>Exemple d'utilisation de la méthode query() de l'adaptateur Db</title>
  1001. <programlisting language="php"><![CDATA[
  1002. $select = $db->select()
  1003. ->from('produits');
  1004. $stmt = $db->query($select);
  1005. $result = $stmt->fetchAll();
  1006. ]]></programlisting>
  1007. </example>
  1008. </sect3>
  1009. <sect3 id="zend.db.select.execute.query-select">
  1010. <title>Exécuter des requêtes Select à partir de objet Select</title>
  1011. <para>
  1012. Comme alternative à l'emploi de la méthode <methodname>query()</methodname>de l'objet
  1013. adaptateur, vous pouvez utiliser la méthode <methodname>query()</methodname> de l'objet
  1014. <classname>Zend_Db_Select</classname>. Les deux méthodes retourne un objet de type
  1015. <classname>Zend_Db_Statement</classname> ou <code>PDOStatement</code>, dépendant du
  1016. type d'adaptateur.
  1017. </para>
  1018. <example id="zend.db.select.execute.query-select.example">
  1019. <title>Exemple d'utilisation de la méthode query() de l'objet Select</title>
  1020. <programlisting language="php"><![CDATA[
  1021. $select = $db->select()
  1022. ->from('produits');
  1023. $stmt = $select->query();
  1024. $result = $stmt->fetchAll();
  1025. ]]></programlisting>
  1026. </example>
  1027. </sect3>
  1028. <sect3 id="zend.db.select.execute.tostring">
  1029. <title>Convertir un objet Select en une chaîne SQL</title>
  1030. <para>
  1031. Si vous devez accéder à la chaîne représentant la requête <acronym>SQL</acronym> correspondant à
  1032. un objet <classname>Zend_Db_Select</classname>, utilisez la méthode
  1033. <methodname>__toString()</methodname>.
  1034. </para>
  1035. <example id="zend.db.select.execute.tostring.example">
  1036. <title>Exemple d'utilisation de la méthode __toString()</title>
  1037. <programlisting language="php"><![CDATA[
  1038. $select = $db->select()
  1039. ->from('produits');
  1040. $sql = $select->__toString();
  1041. echo "$sql\n";
  1042. // L'affichage est la chaîne :
  1043. // SELECT * FROM "produits"
  1044. ]]></programlisting>
  1045. </example>
  1046. </sect3>
  1047. </sect2>
  1048. <sect2 id="zend.db.select.other">
  1049. <title>Autres méthodes</title>
  1050. <para>
  1051. Cette section décrit les autres méthodes de la classe
  1052. <classname>Zend_Db_Select</classname> qui ne sont pas couvertes ci-dessus :
  1053. <methodname>getPart()</methodname> et <methodname>reset()</methodname>.
  1054. </para>
  1055. <sect3 id="zend.db.select.other.get-part">
  1056. <title>Récupérer des parties de l'objet Select</title>
  1057. <para>
  1058. La méthode <methodname>getPart()</methodname> retourne une représentation d'une partie de
  1059. votre requête <acronym>SQL</acronym>. Par exemple, vous pouvez utiliser cette méthode pour retourner un
  1060. tableau d'expressions pour la clause <constant>WHERE</constant>, ou un tableau de colonnes
  1061. (ou d'expressions de colonnes) qui sont dans l'élément <constant>SELECT</constant>, ou les
  1062. valeurs de nombre et de décalage pour la clause <constant>LIMIT</constant>.
  1063. </para>
  1064. <para>
  1065. La valeur retournée n'est pas une chaîne de caractère contenant un fragment de
  1066. syntaxe <acronym>SQL</acronym>. La valeur retournée est une représentation interne, qui est typiquement
  1067. une structure de type tableau contenant des valeurs et des expressions. Chaque
  1068. partie de la requête a une structure différente.
  1069. </para>
  1070. <para>
  1071. L'argument unique de la méthode <methodname>getPart()</methodname> est une chaîne qui
  1072. identifie quelle partie de la requête Select doit être retournée. Par exemple, la
  1073. chaîne "<code>from</code>" identifie la partie de l'objet Select qui stocke
  1074. l'information concernant les tables dans la clause <constant>FROM</constant>, incluant les
  1075. tables jointes.
  1076. </para>
  1077. <para>
  1078. La classe Zend_Db_Select définit des constantes que vous pouvez utiliser pour
  1079. les parties de la requête <acronym>SQL</acronym>. Vous pouvez utiliser ces constantes ou des chaînes de
  1080. caractères littérales.
  1081. </para>
  1082. <table id="zend.db.select.other.get-part.table">
  1083. <title>Constantes utilisées par getPart() et reset()</title>
  1084. <tgroup cols="2">
  1085. <thead>
  1086. <row>
  1087. <entry>Constante</entry>
  1088. <entry>Chaîne correspondante</entry>
  1089. </row>
  1090. </thead>
  1091. <tbody>
  1092. <row>
  1093. <entry><classname>Zend_Db_Select::DISTINCT</classname></entry>
  1094. <entry><code>'distinct'</code></entry>
  1095. </row>
  1096. <row>
  1097. <entry><classname>Zend_Db_Select::FOR_UPDATE</classname></entry>
  1098. <entry><code>'forupdate'</code></entry>
  1099. </row>
  1100. <row>
  1101. <entry><classname>Zend_Db_Select::COLUMNS</classname></entry>
  1102. <entry><code>'columns'</code></entry>
  1103. </row>
  1104. <row>
  1105. <entry><classname>Zend_Db_Select::FROM</classname></entry>
  1106. <entry><code>'from'</code></entry>
  1107. </row>
  1108. <row>
  1109. <entry><classname>Zend_Db_Select::WHERE</classname></entry>
  1110. <entry><code>'where'</code></entry>
  1111. </row>
  1112. <row>
  1113. <entry><classname>Zend_Db_Select::GROUP</classname></entry>
  1114. <entry><code>'group'</code></entry>
  1115. </row>
  1116. <row>
  1117. <entry><classname>Zend_Db_Select::HAVING</classname></entry>
  1118. <entry><code>'having'</code></entry>
  1119. </row>
  1120. <row>
  1121. <entry><classname>Zend_Db_Select::ORDER</classname></entry>
  1122. <entry><code>'order'</code></entry>
  1123. </row>
  1124. <row>
  1125. <entry><classname>Zend_Db_Select::LIMIT_COUNT</classname></entry>
  1126. <entry><code>'limitcount'</code></entry>
  1127. </row>
  1128. <row>
  1129. <entry><classname>Zend_Db_Select::LIMIT_OFFSET</classname></entry>
  1130. <entry><code>'limitoffset'</code></entry>
  1131. </row>
  1132. </tbody>
  1133. </tgroup>
  1134. </table>
  1135. <example id="zend.db.select.other.get-part.example">
  1136. <title>Exemple d'utilisation de la méthode getPart()</title>
  1137. <programlisting language="php"><![CDATA[
  1138. $select = $db->select()
  1139. ->from('produits')
  1140. ->order('produit_id');
  1141. // Vous pouvez spécifier une chaîne littérale
  1142. $orderData = $select->getPart( 'order' );
  1143. // Vous pouvez utiliser une constante
  1144. $orderData = $select->getPart( Zend_Db_Select::ORDER );
  1145. // La valeur retournée peut être une structure tableau, pas une chaîne.
  1146. // Chaque partie a une structure différente
  1147. print_r( $orderData );
  1148. ]]></programlisting>
  1149. </example>
  1150. </sect3>
  1151. <sect3 id="zend.db.select.other.reset">
  1152. <title>Effacer des parties de l'objet Select</title>
  1153. <para>
  1154. La méthode <methodname>reset()</methodname> vous permet de vider une partie spécifique de
  1155. la requête <acronym>SQL</acronym>, ou toutes les parties si vous omettez l'argument.
  1156. </para>
  1157. <para>
  1158. L'argument unique est facultatif. Vous pouvez spécifier la partie de la
  1159. requête à effacer, en utilisant les mêmes chaînes que vous utilisez en tant
  1160. qu'argument de la méthode <methodname>getPart()</methodname>. La partie de la requête que vous
  1161. spécifiez est initialisée à l'état par défaut.
  1162. </para>
  1163. <para>
  1164. Si vous omettez le paramètre, <methodname>reset()</methodname> initialise toutes les
  1165. parties de la requête à leurs valeurs par défaut. Ceci rend l'objet Zend_Db_Select
  1166. équivalent à un nouvel objet, comme si vous l'aviez tout juste instancié.
  1167. </para>
  1168. <example id="zend.db.select.other.reset.example">
  1169. <title>Exemple d'utilisation de la méthode reset()</title>
  1170. <programlisting language="php"><![CDATA[
  1171. // Construire cette requête :
  1172. // SELECT p.*
  1173. // FROM "produits" AS p
  1174. // ORDER BY "produit_nom"
  1175. $select = $db->select()
  1176. ->from(array('p' => 'produits')
  1177. ->order('produit_nom');
  1178. // Changer la condition d'ordre avec une colonne différente :
  1179. // SELECT p.*
  1180. // FROM "produits" AS p
  1181. // ORDER BY "produit_id"
  1182. // Vider la partie afin de la redéfinir
  1183. $select->reset( Zend_Db_Select::ORDER );
  1184. // Et spécifier une colonne différente
  1185. $select->order('produit_id');
  1186. // Vider toutes les parties de la requête
  1187. $select->reset();
  1188. ]]></programlisting>
  1189. </example>
  1190. </sect3>
  1191. </sect2>
  1192. </sect1>