Zend_Db_Select.xml 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17409 -->
  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. <para>
  617. Cette méthode accepte un seul paramètre. Si vous avez une expression dans
  618. laquelle vous devez substituer plusieurs variables, vous devez formater la chaîne
  619. manuellement, en interpolant les variables et en les échappant vous-même.
  620. </para>
  621. <example id="zend.db.select.building.where.example-param">
  622. <title>Exemple d'un paramètre dans la méthode where()</title>
  623. <programlisting language="php"><![CDATA[
  624. // Construire cette requête :
  625. // SELECT produit_id, produit_nom, prix
  626. // FROM "produits"
  627. // WHERE (prix > 100.00)
  628. $prixminimum = 100;
  629. $select = $db->select()
  630. ->from('produits',
  631. array('produit_id', 'produit_nom', 'prix'))
  632. ->where('prix > ?', $prixminimum);
  633. ]]></programlisting>
  634. </example>
  635. <para>
  636. Vous pouvez appeler la méthode <methodname>where()</methodname> plusieurs fois sur la même
  637. objet <classname>Zend_Db_Select</classname>. La requête résultante combine les
  638. différents termes ensemble en utilisant <constant>AND</constant> entre eux.
  639. </para>
  640. <example id="zend.db.select.building.where.example-and">
  641. <title>Exemple avec plusieurs appels de where()</title>
  642. <programlisting language="php"><![CDATA[
  643. // Construire cette requête :
  644. // SELECT produit_id, produit_nom, prix
  645. // FROM "produits"
  646. // WHERE (prix > 100.00)
  647. // AND (prix < 500.00)
  648. $prixminimum = 100;
  649. $prixmaximum = 500;
  650. $select = $db->select()
  651. ->from('produits',
  652. array('produit_id', 'produit_nom', 'prix'))
  653. ->where('prix > ?', $prixminimum)
  654. ->where('prix < ?', $prixmaximum);
  655. ]]></programlisting>
  656. </example>
  657. <para>
  658. Si vous devez combiner ensemble des termes en utilisant <code>OR</code>,
  659. utilisez la méthode <methodname>orWhere()</methodname>. Cette méthode est utilisée de la même
  660. manière que la méthode <methodname>where()</methodname>, excepté que le terme spécifié est
  661. précédé par <code>OR</code>, au lieu de <constant>AND</constant>.
  662. </para>
  663. <example id="zend.db.select.building.where.example-or">
  664. <title>Exemple d'utilisation de la méthode orWhere()</title>
  665. <programlisting language="php"><![CDATA[
  666. // Construire cette requête :
  667. // SELECT produit_id, produit_nom, prix
  668. // FROM "produits"
  669. // WHERE (prix < 100.00)
  670. // OR (prix > 500.00)
  671. $prixminimum = 100;
  672. $prixmaximum = 500;
  673. $select = $db->select()
  674. ->from('produits',
  675. array('produit_id', 'produit_nom', 'prix'))
  676. ->where('prix < ?', $prixminimum)
  677. ->orWhere('prix > ?', $prixmaximum);
  678. ]]></programlisting>
  679. </example>
  680. <para>
  681. <classname>Zend_Db_Select</classname> met automatiquement des parenthèses
  682. autour de chaque expression spécifiée en utilisant les méthodes <methodname>where()</methodname>
  683. ou <methodname>orWhere()</methodname>. Ceci permet de s'assurer que la priorité de l'opérateur
  684. booléen n'entraîne pas de résultats inattendus.
  685. </para>
  686. <example id="zend.db.select.building.where.example-parens">
  687. <title>Exemple de mise en parenthèse d'expressions booléennes</title>
  688. <programlisting language="php"><![CDATA[
  689. // Construire cette requête :
  690. // SELECT produit_id, produit_nom, prix
  691. // FROM "produits"
  692. // WHERE (prix < 100.00 OR prix > 500.00)
  693. // AND (produit_nom = 'Pomme')
  694. $prixminimum = 100;
  695. $prixmaximum = 500;
  696. $prod = 'Pomme';
  697. $select = $db->select()
  698. ->from('produits',
  699. array('produit_id', 'produit_nom', 'prix'))
  700. ->where("prix < $prixminimum OR prix > $prixmaximum")
  701. ->where('produit_nom = ?', $prod);
  702. ]]></programlisting>
  703. </example>
  704. <para>
  705. Dans l'exemple ci-dessus, le résultat serait tout à fait différent sans
  706. parenthèses, car <constant>AND</constant> a une plus grande priorité que <code>OR</code>.
  707. <classname>Zend_Db_Select</classname> applique les parenthèses avec pour effet de
  708. relier de manière plus étroite chaque expression dans les appels successifs de
  709. <methodname>where()</methodname> qu'avec <constant>AND</constant> qui combine les expressions.
  710. </para>
  711. </sect3>
  712. <sect3 id="zend.db.select.building.group">
  713. <title>Ajouter une clause GROUP BY</title>
  714. <para>
  715. Dans la syntaxe <acronym>SQL</acronym>, la clause <code>GROUP BY</code> vous permet de réduire le
  716. nombre de lignes du résultat de la requête à une ligne par valeur unique trouvé dans
  717. une(des) colonne(s) nommées) dans la clause <code>GROUP BY</code>.
  718. </para>
  719. <para>
  720. Dans <classname>Zend_Db_Select</classname>, vous pouvez spécifier la(es)
  721. colonne(s) à utiliser pour calculer les groupes de lignes en utilisant la méthode
  722. <methodname>group()</methodname>. L'argument de cette méthode est une colonne ou un tableau de
  723. colonnes à utiliser dans la clause <code>GROUP BY</code>.
  724. </para>
  725. <example id="zend.db.select.building.group.example">
  726. <title>Exemple d'utilisation de la méthode group()</title>
  727. <programlisting language="php"><![CDATA[
  728. // Construire cette requête :
  729. // SELECT p."produit_id", COUNT(*) AS ligne_items_par_produit
  730. // FROM "produits" AS p JOIN "ligne_items" AS l
  731. // ON p.produit_id = l.produit_id
  732. // GROUP BY p.produit_id
  733. $select = $db->select()
  734. ->from(array('p' => 'produits'),
  735. array('produit_id'))
  736. ->join(array('l' => 'ligne_items'),
  737. 'p.produit_id = l.produit_id',
  738. array('ligne_items_par_produit' => 'COUNT(*)'))
  739. ->group('p.produit_id');
  740. ]]></programlisting>
  741. </example>
  742. <para>
  743. Comme le tableau de colonnes de la méthode <methodname>from()</methodname>, vous pouvez
  744. utiliser des noms d'alias dans le nom de la colonne, et la colonne est échappée
  745. comme un identificateur à moins que la chaîne ne contiennent des parenthèses ou que
  746. ce soit un objet de type <classname>Zend_Db_Expr</classname>.
  747. </para>
  748. </sect3>
  749. <sect3 id="zend.db.select.building.having">
  750. <title>Ajouter une clause HAVING</title>
  751. <para>
  752. Dans la syntaxe <acronym>SQL</acronym>, la clause <constant>HAVING</constant> applique une restriction
  753. sur un groupe de lignes. Ceci est similaire à la manière dont la clause
  754. <constant>WHERE</constant> applique une restriction sur des lignes. Mais les deux clauses
  755. sont différentes car les conditions <constant>WHERE</constant> sont appliquées avant que les
  756. groupes de lignes ne soient définis, alors que les conditions <constant>HAVING</constant>
  757. sont appliquées après que les groupes aient été définis.
  758. </para>
  759. <para>
  760. Dans <classname>Zend_Db_Select</classname>, vous pouvez spécifier des
  761. conditions pour restreindre des groupes en utilisant la méthode
  762. <methodname>having()</methodname>. Son utilisation est similaire à celle de la méthode
  763. <methodname>where()</methodname>. Le premier argument est une chaîne contenant une expression
  764. <acronym>SQL</acronym>. Le second argument facultatif est une valeur qui est utilisé pour remplacer le
  765. caractère de substitution positionné dans l'expression <acronym>SQL</acronym>. Les expressions passées
  766. dans de multiples appels de la méthode <methodname>having()</methodname> sont combinées en
  767. utilisant l'opérateur booléen <constant>AND</constant>, ou l'opérateur <code>OR</code> si
  768. vous utilisez la méthode <methodname>orHaving()</methodname>.
  769. </para>
  770. <example id="zend.db.select.building.having.example">
  771. <title>Exemple d'utilisation de la méthode having()</title>
  772. <programlisting language="php"><![CDATA[
  773. // Construire cette requête :
  774. // SELECT p."produit_id", COUNT(*) AS ligne_items_par_produit
  775. // FROM "produits" AS p JOIN "ligne_items" AS l
  776. // ON p.produit_id = l.produit_id
  777. // GROUP BY p.produit_id
  778. // HAVING ligne_items_par_produit > 10
  779. $select = $db->select()
  780. ->from(array('p' => 'produits'),
  781. array('produit_id'))
  782. ->join(array('l' => 'ligne_items'),
  783. 'p.produit_id = l.produit_id',
  784. array('ligne_items_par_produit' => 'COUNT(*)'))
  785. ->group('p.produit_id')
  786. ->having('ligne_items_par_produit > 10');
  787. ]]></programlisting>
  788. </example>
  789. <note>
  790. <para>
  791. Aucun échappement n'est appliqué aux expressions fournies aux méthodes
  792. <methodname>having()</methodname> ou <methodname>orHaving()</methodname>. Si vous avez des noms de
  793. colonnes qui nécessitent d'être échappées, vous devez utiliser
  794. <methodname>quoteIdentifier()</methodname> quand vous générez la chaîne de cette
  795. condition.
  796. </para>
  797. </note>
  798. </sect3>
  799. <sect3 id="zend.db.select.building.order">
  800. <title>Ajouter une clause ORDER BY</title>
  801. <para>
  802. Dans la syntaxe <acronym>SQL</acronym>, la clause <code>ORDER BY</code> spécifie une ou plusieurs
  803. colonnes ou expressions suivant lesquelles le résultat d'une requête doit être trié.
  804. Si plusieurs colonnes sont listées, les colonnes secondaires sont utilisées pour
  805. résoudre les égalités ; l'ordre du tri est déterminé par les colonnes secondaires si
  806. les colonnes précédentes contiennent des valeurs identiques. Le tri par défaut est
  807. ascendant (du plus petit vers le plus grand). Vous pouvez aussi appliqué un tri
  808. descendant (du plus grand vers le plus petit) pour une colonne en spécifiant le
  809. mot-clé <constant>DESC</constant> après la colonne.
  810. </para>
  811. <para>
  812. Dans <classname>Zend_Db_Select</classname>, vous pouvez utiliser la méthode
  813. <methodname>order()</methodname> pour spécifier une colonne ou un tableau de colonnes par
  814. lesquelles vous voulez trier. Chaque élément du tableau est une chaîne nommant une
  815. colonne, facultativement suivi les mots-clés <constant>ASC</constant> ou <constant>DESC</constant>
  816. en séparant avec un espace.
  817. </para>
  818. <para>
  819. Comme pour les méthodes <methodname>from()</methodname> et <methodname>group()</methodname>, les noms
  820. de colonnes sont échappées comme des identificateurs, à moins qu'elles ne
  821. contiennent des parenthèses ou ne soient des objets de type
  822. <classname>Zend_Db_Expr</classname>.
  823. </para>
  824. <example id="zend.db.select.building.order.example">
  825. <title>Exemple d'utilisation de la méthode order()</title>
  826. <programlisting language="php"><![CDATA[
  827. // Construire cette requête :
  828. // SELECT p."produit_id", COUNT(*) AS ligne_items_par_produit
  829. // FROM "produits" AS p JOIN "ligne_items" AS l
  830. // ON p.produit_id = l.produit_id
  831. // GROUP BY p.produit_id
  832. // ORDER BY "ligne_items_par_produit" DESC, "produit_id"
  833. $select = $db->select()
  834. ->from(array('p' => 'produits'),
  835. array('produit_id'))
  836. ->join(array('l' => 'ligne_items'),
  837. 'p.produit_id = l.produit_id',
  838. array('ligne_items_par_produit' => 'COUNT(*)'))
  839. ->group('p.produit_id')
  840. ->order(array('ligne_items_par_produit DESC',
  841. 'produit_id'));
  842. ]]></programlisting>
  843. </example>
  844. </sect3>
  845. <sect3 id="zend.db.select.building.limit">
  846. <title>Ajouter une clause LIMIT</title>
  847. <para>
  848. Certaines marques de SGBDR étendent la syntaxe <acronym>SQL</acronym> avec une clause
  849. <constant>LIMIT</constant>. Cette clause réduit le nombre de lignes d'un résultat à un
  850. nombre maximum que vous spécifiez. Vous pouvez de plus indiquer un nombre de lignes
  851. à éviter avant de commencer à produire le résultat. Cette fonctionnalité facilite
  852. l'extraction d'un sous-ensemble d'un résultat, par exemple quand vous affichez des
  853. résultats avec un défilement de pages.
  854. </para>
  855. <para>
  856. Dans <classname>Zend_Db_Select</classname>, vous pouvez utiliser la méthode
  857. <methodname>limit()</methodname> pour spécifier le nombre de lignes ainsi que le nombre de
  858. lignes à omettre. Le premier argument de cette méthode est le nombre de lignes
  859. désirées. Le second argument est le nombre de lignes à omettre.
  860. </para>
  861. <example id="zend.db.select.building.limit.example">
  862. <title>Exemple d'utilisation de la méthode limit()</title>
  863. <programlisting language="php"><![CDATA[
  864. // Construire cette requête :
  865. // SELECT p."produit_id", p."produit_nom"
  866. // FROM "produits" AS p
  867. // LIMIT 10, 20
  868. $select = $db->select()
  869. ->from(array('p' => 'produits'),
  870. array('produit_id', 'produit_nom'))
  871. ->limit(10, 20);
  872. ]]></programlisting>
  873. </example>
  874. <note>
  875. <para>
  876. La syntaxe <constant>LIMIT</constant> n'est pas supporté par toutes les marques de
  877. SGBDR. Quelques SGBDR nécessite une syntaxe différente pour supporter une
  878. fonctionnalité similaire. Chaque classe
  879. <classname>Zend_Db_Adapter_Abstract</classname> inclue une méthode pour produire
  880. le code <acronym>SQL</acronym> approprié à ce SGBDR.
  881. </para>
  882. </note>
  883. <para>
  884. Utilisez de manière alternative la méthode <methodname>limitPage()</methodname> pour
  885. spécifier le nombre de lignes et le décalage. Cette méthode vous permet de limiter
  886. le jeu de résultats à une série d'un nombre fixé de résultats issus du jeu total de
  887. résultats de la requête. En d'autres termes, vous spécifiez la taille de la "page"
  888. de résultats, et le nombre ordinal de la page unique de résultats que vous souhaitez
  889. voir retourner par la requête. Le numéro de la page est le premier argument de la
  890. méthode <methodname>limitPage()</methodname>, et la taille de la page est le second argument.
  891. Les deux arguments sont obligatoires ; ils n'ont pas de valeurs par défaut.
  892. </para>
  893. <example id="zend.db.select.building.limit.example2">
  894. <title>Exemple d'utilisation de la méthode limitPage()</title>
  895. <programlisting language="php"><![CDATA[
  896. // Construire cette requête :
  897. // SELECT p."product_id", p."product_name"
  898. // FROM "products" AS p
  899. // LIMIT 10, 20
  900. $select = $db->select()
  901. ->from(array('p' => 'products'),
  902. array('product_id', 'product_name'))
  903. ->limitPage(2, 10);
  904. ]]></programlisting>
  905. </example>
  906. </sect3>
  907. <sect3 id="zend.db.select.building.distinct">
  908. <title>Ajouter le modificateur de requête DISTINCT</title>
  909. <para>
  910. La méthode <methodname>distinct()</methodname> vous permet d'ajouter le mot-clé
  911. <constant>DISTINCT</constant> à votre requête <acronym>SQL</acronym>.
  912. </para>
  913. <example id="zend.db.select.building.distinct.example">
  914. <title>Exemple d'utilisation de la méthode distinct()</title>
  915. <programlisting language="php"><![CDATA[
  916. // Construire cette requête :
  917. // SELECT DISTINCT p."produit_nom"
  918. // FROM "produits" AS p
  919. $select = $db->select()
  920. ->distinct()
  921. ->from(array('p' => 'produits'), 'produit_nom');
  922. ]]></programlisting>
  923. </example>
  924. </sect3>
  925. <sect3 id="zend.db.select.building.for-update">
  926. <title>Ajouter le modificateur de requête FOR UPDATE</title>
  927. <para>
  928. La méthode <methodname>forUpdate()</methodname> vous permet d'ajouter le modificateur
  929. <code>FOR UPDATE</code> à votre requête <acronym>SQL</acronym>.
  930. </para>
  931. <example id="zend.db.select.building.for-update.example">
  932. <title>Exemple d'utilisation de la méthode forUpdate()</title>
  933. <programlisting language="php"><![CDATA[
  934. // Construire cette requête :
  935. // SELECT FOR UPDATE p.*
  936. // FROM "produits" AS p
  937. $select = $db->select()
  938. ->forUpdate()
  939. ->from(array('p' => 'produits'));
  940. ]]></programlisting>
  941. </example>
  942. </sect3>
  943. </sect2>
  944. <sect2 id="zend.db.select.execute">
  945. <title>Exécuter des requêtes Select</title>
  946. <para>
  947. Cette section décrit comment exécuter une requête représentée par un objet
  948. <classname>Zend_Db_Select</classname>.
  949. </para>
  950. <sect3 id="zend.db.select.execute.query-adapter">
  951. <title>Exécuter des requêtes Select à partir de l'adaptateur Db</title>
  952. <para>
  953. Vous pouvez exécuter la requête représentée par l'objet
  954. <classname>Zend_Db_Select</classname> en le passant comme premier argument de la
  955. méthode <methodname>query()</methodname> d'un objet
  956. <classname>Zend_Db_Adapter_Abstract</classname>. Utilisez les objets
  957. <classname>Zend_Db_Select</classname> plutôt qu'une simple chaîne de requête.
  958. </para>
  959. <para>
  960. La méthode <methodname>query()</methodname> retourne un objet de type
  961. <classname>Zend_Db_Statement</classname> ou <code>PDOStatement</code>, dépendant du
  962. type d'adaptateur.
  963. </para>
  964. <example id="zend.db.select.execute.query-adapter.example">
  965. <title>Exemple d'utilisation de la méthode query() de l'adaptateur Db</title>
  966. <programlisting language="php"><![CDATA[
  967. $select = $db->select()
  968. ->from('produits');
  969. $stmt = $db->query($select);
  970. $result = $stmt->fetchAll();
  971. ]]></programlisting>
  972. </example>
  973. </sect3>
  974. <sect3 id="zend.db.select.execute.query-select">
  975. <title>Exécuter des requêtes Select à partir de objet Select</title>
  976. <para>
  977. Comme alternative à l'emploi de la méthode <methodname>query()</methodname>de l'objet
  978. adaptateur, vous pouvez utiliser la méthode <methodname>query()</methodname> de l'objet
  979. <classname>Zend_Db_Select</classname>. Les deux méthodes retourne un objet de type
  980. <classname>Zend_Db_Statement</classname> ou <code>PDOStatement</code>, dépendant du
  981. type d'adaptateur.
  982. </para>
  983. <example id="zend.db.select.execute.query-select.example">
  984. <title>Exemple d'utilisation de la méthode query() de l'objet Select</title>
  985. <programlisting language="php"><![CDATA[
  986. $select = $db->select()
  987. ->from('produits');
  988. $stmt = $select->query();
  989. $result = $stmt->fetchAll();
  990. ]]></programlisting>
  991. </example>
  992. </sect3>
  993. <sect3 id="zend.db.select.execute.tostring">
  994. <title>Convertir un objet Select en une chaîne SQL</title>
  995. <para>
  996. Si vous devez accéder à la chaîne représentant la requête <acronym>SQL</acronym> correspondant à
  997. un objet <classname>Zend_Db_Select</classname>, utilisez la méthode
  998. <methodname>__toString()</methodname>.
  999. </para>
  1000. <example id="zend.db.select.execute.tostring.example">
  1001. <title>Exemple d'utilisation de la méthode __toString()</title>
  1002. <programlisting language="php"><![CDATA[
  1003. $select = $db->select()
  1004. ->from('produits');
  1005. $sql = $select->__toString();
  1006. echo "$sql\n";
  1007. // L'affichage est la chaîne :
  1008. // SELECT * FROM "produits"
  1009. ]]></programlisting>
  1010. </example>
  1011. </sect3>
  1012. </sect2>
  1013. <sect2 id="zend.db.select.other">
  1014. <title>Autres méthodes</title>
  1015. <para>
  1016. Cette section décrit les autres méthodes de la classe
  1017. <classname>Zend_Db_Select</classname> qui ne sont pas couvertes ci-dessus :
  1018. <methodname>getPart()</methodname> et <methodname>reset()</methodname>.
  1019. </para>
  1020. <sect3 id="zend.db.select.other.get-part">
  1021. <title>Récupérer des parties de l'objet Select</title>
  1022. <para>
  1023. La méthode <methodname>getPart()</methodname> retourne une représentation d'une partie de
  1024. votre requête <acronym>SQL</acronym>. Par exemple, vous pouvez utiliser cette méthode pour retourner un
  1025. tableau d'expressions pour la clause <constant>WHERE</constant>, ou un tableau de colonnes
  1026. (ou d'expressions de colonnes) qui sont dans l'élément <constant>SELECT</constant>, ou les
  1027. valeurs de nombre et de décalage pour la clause <constant>LIMIT</constant>.
  1028. </para>
  1029. <para>
  1030. La valeur retournée n'est pas une chaîne de caractère contenant un fragment de
  1031. syntaxe <acronym>SQL</acronym>. La valeur retournée est une représentation interne, qui est typiquement
  1032. une structure de type tableau contenant des valeurs et des expressions. Chaque
  1033. partie de la requête a une structure différente.
  1034. </para>
  1035. <para>
  1036. L'argument unique de la méthode <methodname>getPart()</methodname> est une chaîne qui
  1037. identifie quelle partie de la requête Select doit être retournée. Par exemple, la
  1038. chaîne "<code>from</code>" identifie la partie de l'objet Select qui stocke
  1039. l'information concernant les tables dans la clause <constant>FROM</constant>, incluant les
  1040. tables jointes.
  1041. </para>
  1042. <para>
  1043. La classe Zend_Db_Select définit des constantes que vous pouvez utiliser pour
  1044. les parties de la requête <acronym>SQL</acronym>. Vous pouvez utiliser ces constantes ou des chaînes de
  1045. caractères littérales.
  1046. </para>
  1047. <table id="zend.db.select.other.get-part.table">
  1048. <title>Constantes utilisées par getPart() et reset()</title>
  1049. <tgroup cols="2">
  1050. <thead>
  1051. <row>
  1052. <entry>Constante</entry>
  1053. <entry>Chaîne correspondante</entry>
  1054. </row>
  1055. </thead>
  1056. <tbody>
  1057. <row>
  1058. <entry><classname>Zend_Db_Select::DISTINCT</classname></entry>
  1059. <entry><code>'distinct'</code></entry>
  1060. </row>
  1061. <row>
  1062. <entry><classname>Zend_Db_Select::FOR_UPDATE</classname></entry>
  1063. <entry><code>'forupdate'</code></entry>
  1064. </row>
  1065. <row>
  1066. <entry><classname>Zend_Db_Select::COLUMNS</classname></entry>
  1067. <entry><code>'columns'</code></entry>
  1068. </row>
  1069. <row>
  1070. <entry><classname>Zend_Db_Select::FROM</classname></entry>
  1071. <entry><code>'from'</code></entry>
  1072. </row>
  1073. <row>
  1074. <entry><classname>Zend_Db_Select::WHERE</classname></entry>
  1075. <entry><code>'where'</code></entry>
  1076. </row>
  1077. <row>
  1078. <entry><classname>Zend_Db_Select::GROUP</classname></entry>
  1079. <entry><code>'group'</code></entry>
  1080. </row>
  1081. <row>
  1082. <entry><classname>Zend_Db_Select::HAVING</classname></entry>
  1083. <entry><code>'having'</code></entry>
  1084. </row>
  1085. <row>
  1086. <entry><classname>Zend_Db_Select::ORDER</classname></entry>
  1087. <entry><code>'order'</code></entry>
  1088. </row>
  1089. <row>
  1090. <entry><classname>Zend_Db_Select::LIMIT_COUNT</classname></entry>
  1091. <entry><code>'limitcount'</code></entry>
  1092. </row>
  1093. <row>
  1094. <entry><classname>Zend_Db_Select::LIMIT_OFFSET</classname></entry>
  1095. <entry><code>'limitoffset'</code></entry>
  1096. </row>
  1097. </tbody>
  1098. </tgroup>
  1099. </table>
  1100. <example id="zend.db.select.other.get-part.example">
  1101. <title>Exemple d'utilisation de la méthode getPart()</title>
  1102. <programlisting language="php"><![CDATA[
  1103. $select = $db->select()
  1104. ->from('produits')
  1105. ->order('produit_id');
  1106. // Vous pouvez spécifier une chaîne littérale
  1107. $orderData = $select->getPart( 'order' );
  1108. // Vous pouvez utiliser une constante
  1109. $orderData = $select->getPart( Zend_Db_Select::ORDER );
  1110. // La valeur retournée peut être une structure tableau, pas une chaîne.
  1111. // Chaque partie a une structure différente
  1112. print_r( $orderData );
  1113. ]]></programlisting>
  1114. </example>
  1115. </sect3>
  1116. <sect3 id="zend.db.select.other.reset">
  1117. <title>Effacer des parties de l'objet Select</title>
  1118. <para>
  1119. La méthode <methodname>reset()</methodname> vous permet de vider une partie spécifique de
  1120. la requête <acronym>SQL</acronym>, ou toutes les parties si vous omettez l'argument.
  1121. </para>
  1122. <para>
  1123. L'argument unique est facultatif. Vous pouvez spécifier la partie de la
  1124. requête à effacer, en utilisant les mêmes chaînes que vous utilisez en tant
  1125. qu'argument de la méthode <methodname>getPart()</methodname>. La partie de la requête que vous
  1126. spécifiez est initialisée à l'état par défaut.
  1127. </para>
  1128. <para>
  1129. Si vous omettez le paramètre, <methodname>reset()</methodname> initialise toutes les
  1130. parties de la requête à leurs valeurs par défaut. Ceci rend l'objet Zend_Db_Select
  1131. équivalent à un nouvel objet, comme si vous l'aviez tout juste instancié.
  1132. </para>
  1133. <example id="zend.db.select.other.reset.example">
  1134. <title>Exemple d'utilisation de la méthode reset()</title>
  1135. <programlisting language="php"><![CDATA[
  1136. // Construire cette requête :
  1137. // SELECT p.*
  1138. // FROM "produits" AS p
  1139. // ORDER BY "produit_nom"
  1140. $select = $db->select()
  1141. ->from(array('p' => 'produits')
  1142. ->order('produit_nom');
  1143. // Changer la condition d'ordre avec une colonne différente :
  1144. // SELECT p.*
  1145. // FROM "produits" AS p
  1146. // ORDER BY "produit_id"
  1147. // Vider la partie afin de la redéfinir
  1148. $select->reset( Zend_Db_Select::ORDER );
  1149. // Et spécifier une colonne différente
  1150. $select->order('produit_id');
  1151. // Vider toutes les parties de la requête
  1152. $select->reset();
  1153. ]]></programlisting>
  1154. </example>
  1155. </sect3>
  1156. </sect2>
  1157. </sect1>