Zend_Db_Select.xml 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20115 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.db.select">
  5. <title>Zend_Db_Select</title>
  6. <sect2 id="zend.db.select.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. Das <classname>Zend_Db_Select</classname> Objekt repräsentiert ein
  10. <acronym>SQL</acronym> <acronym>SELECT</acronym> Anfrage Statement. Die Klasse bietet
  11. Methoden um einzelne Teile der Anfrage hinzuzufügen. Einzelne Teile der Anfrage können
  12. mit Hilfe von <acronym>PHP</acronym> Methoden und Datenstrukturen angegeben werden, und
  13. die Klasse erzeugt korrekte <acronym>SQL</acronym> Syntax. Nachdem die Anfrage
  14. formuliert wurde kann sie ausgeführt werden als wäre sie mit einem normalen String
  15. geschrieben worden.
  16. </para>
  17. <para>
  18. <classname>Zend_Db_Select</classname> bietet folgenden Nutzen:
  19. </para>
  20. <itemizedlist>
  21. <listitem>
  22. <para>
  23. Objekt Orientierte Methoden um <acronym>SQL</acronym> Anfragen Stück für Stück
  24. zu formulieren.
  25. </para>
  26. </listitem>
  27. <listitem>
  28. <para>
  29. Datenbank unabhängige Abstraktion einiger Teile der <acronym>SQL</acronym>
  30. Anfrage.
  31. </para>
  32. </listitem>
  33. <listitem>
  34. <para>
  35. In den meisten Fällen automatische Quotierung von Metadaten um Bezeichner zu
  36. unterstützen welche reservierte <acronym>SQL</acronym> Wörter und spezielle
  37. Zeichen enthalten.
  38. </para>
  39. </listitem>
  40. <listitem>
  41. <para>
  42. Quotierung von Bezeichnern und Werten um dabei zu helfen das Risiko von
  43. <acronym>SQL</acronym> Injektion Attacken zu reduzieren.
  44. </para>
  45. </listitem>
  46. </itemizedlist>
  47. <para>
  48. Nutzung von <classname>Zend_Db_Select</classname> ist nicht zwingend erforderlich. Für
  49. einfache SELECT Anfragen ist es normalerweise einfacher die gesamte
  50. <acronym>SQL</acronym> Anfrage in einem String zu formulieren und mit Hilfe der Methoden
  51. der Adapterklasse, wie <methodname>query()</methodname> oder
  52. <methodname>fetchAll()</methodname>, auszuführen. Die Nutzung von
  53. <classname>Zend_Db_Select</classname> ist hilfreich wenn eine SELECT Anfrage prozedural
  54. oder basierend auf der konditionellen Logik der Anwendung zusammengesetzt wird.
  55. </para>
  56. </sect2>
  57. <sect2 id="zend.db.select.creating">
  58. <title>Erzeugung eines Select Objekts</title>
  59. <para>
  60. Die Instanz eines <classname>Zend_Db_Select</classname> Objekts kann mit Hilfe der
  61. <methodname>select()</methodname> Methode des
  62. <classname>Zend_Db_Adapter_Abstract</classname> Objekts erzeugt werden.
  63. </para>
  64. <example id="zend.db.select.creating.example-db">
  65. <title>Beispiel für die Nutzung der select() Methode der Datenbankadapterklasse</title>
  66. <programlisting language="php"><![CDATA[
  67. $db = Zend_Db::factory( ...Optionen... );
  68. $select = $db->select();
  69. ]]></programlisting>
  70. </example>
  71. <para>
  72. Ein anderer Weg ein <classname>Zend_Db_Select</classname> Objekt zu erzeugen ist die
  73. Nutzung des Konstruktors unter Angabe des Datenbankadapters als Argument.
  74. </para>
  75. <example id="zend.db.select.creating.example-new">
  76. <title>Beispiel für die Erzeugung eines Select Objektes</title>
  77. <programlisting language="php"><![CDATA[
  78. $db = Zend_Db::factory( ...Optionen... );
  79. $select = new Zend_Db_Select($db);
  80. ]]></programlisting>
  81. </example>
  82. </sect2>
  83. <sect2 id="zend.db.select.building">
  84. <title>Erstellung von Select Anfragen</title>
  85. <para>
  86. Wenn die Anfrage erstellt wird können Bedingungen der Anfrage nacheinander hinzugefügt
  87. werden. Es gibt eine separate Methode für das Hinzufügen von verschiedenen Bedingungen
  88. zum <classname>Zend_Db_Select</classname> Objekt.
  89. </para>
  90. <example id="zend.db.select.building.example">
  91. <title>Beispiele für die Nutzung der Methoden zum Hinzufügen von Bedingungen</title>
  92. <programlisting language="php"><![CDATA[
  93. // Erzeugung des Zend_Db_Select Objekts
  94. $select = $db->select();
  95. // Hinzufügen einer FROM Bedingung
  96. $select->from( ...Angabe von Tabelle und Spalten... )
  97. // Hinzufügen einer WHERE Bedingung
  98. $select->where( ...Angabe von Suchkriterien... )
  99. // Hinzufügen einer ORDER BY Bedingung
  100. $select->order( ...Angabe von Sortierkriterien... );
  101. ]]></programlisting>
  102. </example>
  103. <para>
  104. Die meisten Methoden des <classname>Zend_Db_Select</classname> Objekts lassen sich auch
  105. über das bequeme Fluent Interface nutzen. Fluent Interface bedeutet das jede Methode
  106. eine Referenz auf das aufrufende Objekt zurück gibt, daher kann direkt eine andere
  107. Methode aufgerufen werden.
  108. </para>
  109. <example id="zend.db.select.building.example-fluent">
  110. <title>Beispiel für die Nutzung der flüssigen Schnittstelle</title>
  111. <programlisting language="php"><![CDATA[
  112. $select = $db->select()
  113. ->from( ...Angabe von Tabelle und Spalten... )
  114. ->where( ...Angabe von Suchkriterien... )
  115. ->order( ...Angabe von Sortierkriterien... );
  116. ]]></programlisting>
  117. </example>
  118. <para>
  119. Die Beispiele in diesem Abschnitt zeigen die Nutzung des Fluent Interface, es kann aber
  120. auch immer das normale Interface verwendet werden. Häufig ist es nötig das normale
  121. Interface zu nutzen, zum Beispiel wenn die Anwendung vor dem Hinzufügen der Bedingung
  122. Berechnungen durchführen muss.
  123. </para>
  124. <sect3 id="zend.db.select.building.from">
  125. <title>Hinzufügen eines FROM Abschnitts</title>
  126. <para>
  127. Um die Tabelle für die Anfrage an zu geben wird die <methodname>from()</methodname>
  128. Methode verwendet. Der Tabellenname kann als einfacher String übergeben werden.
  129. <classname>Zend_Db_Select</classname> wendet Bezeichner Quotierung an, es können
  130. also auch spezielle Zeichen verwendet werden.
  131. </para>
  132. <example id="zend.db.select.building.from.example">
  133. <title>Beispiel für die from() Methode</title>
  134. <programlisting language="php"><![CDATA[
  135. // Erstellen dieser Anfrage:
  136. // SELECT *
  137. // FROM "products"
  138. $select = $db->select()
  139. ->from( 'products' );
  140. ]]></programlisting>
  141. </example>
  142. <para>
  143. Es kann auch der Beziehungsname (auch Aliasname genannt) einer Tabelle angegeben
  144. werden. Anstelle eines einfachen Strings muss dann ein assoziatives Array übergeben
  145. werden, welches den Beziehungsnamen dem tatsächlichen Tabellennamen zuordnet. In
  146. anderen Bedingungen der <acronym>SQL</acronym> Anfrage kann dann dieser
  147. Beziehungsname verwendet werden. Wenn die Anfrage mehr als eine Tabelle verbindet,
  148. generiert <classname>Zend_Db_Select</classname> eindeutige Beziehungsnamen basierend
  149. auf den Tabellennamen, wenn keine Beziehungsnamen angegeben wurden.
  150. </para>
  151. <example id="zend.db.select.building.from.example-cname">
  152. <title>Beispiel für das Angeben eines Beziehungsnamens</title>
  153. <programlisting language="php"><![CDATA[
  154. // Erzeugt diese Anfrage:
  155. // SELECT p.*
  156. // FROM "products" AS p
  157. $select = $db->select()
  158. ->from( array('p' => 'products') );
  159. ]]></programlisting>
  160. </example>
  161. <para>
  162. Einige <acronym>RDBMS</acronym> Marken unterstützen einen voran stehenden
  163. Schemenbezeichner für eine Tabelle. Der Tabellenname kann mit
  164. "<code>schemaName.tabellenName</code>" angegeben werden,
  165. <classname>Zend_Db_Select</classname> Quotiert die einzelnen Teile für sich. Der
  166. Schemaname kann aber auch separat angegeben werden. Ein Schemaname, der mit dem
  167. Tabellennamen angegeben wurde bekommt Vorrang, falls beides angegeben wurde.
  168. </para>
  169. <example id="zend.db.select.building.from.example-schema">
  170. <title>Beispiel für das Angeben eines Schemanamens</title>
  171. <programlisting language="php"><![CDATA[
  172. // Erzeut diese Anfrage:
  173. // SELECT *
  174. // FROM "myschema"."products"
  175. $select = $db->select()
  176. ->from( 'myschema.products' );
  177. // oder
  178. $select = $db->select()
  179. ->from('products', '*', 'myschema');
  180. ]]></programlisting>
  181. </example>
  182. </sect3>
  183. <sect3 id="zend.db.select.building.columns">
  184. <title>Hinzufügen von Spalten</title>
  185. <para>
  186. Im zweiten Argument der <methodname>from()</methodname> Methode kann angegeben
  187. werden, welche Spalten der Tabelle ausgelesen werden sollen. Werden keine
  188. Spalten angegeben, so gilt der Standardwert <code>*</code>, der
  189. <acronym>SQL</acronym> Platzhalter für alle Spalten.
  190. </para>
  191. <para>
  192. Die Spalten können in einem einfachen Array von Strings oder einem assoziativen
  193. Array, in dem Aliasnamen den Spaltennamen zugewiesen werden, angegeben werden. Soll
  194. nur eine einzelne Spalte ohne Aliasnamen ausgelesen werden, so kann auch ein
  195. einfacher String übergeben werden.
  196. </para>
  197. <para>
  198. Wird ein leeres Array übergeben, so werden auch keine Spalten der Tabelle in den
  199. Ergebnissatz aufgenommen. Ein Codebeispiel gibt es unter
  200. <link linkend="zend.db.select.building.join.example-no-columns">code example</link>
  201. bei der <methodname>join()</methodname> Methode.
  202. </para>
  203. <para>
  204. Der Spaltenname kann mit "<code>beziehungsName.spaltenName</code>" angegeben
  205. werden. <classname>Zend_Db_Select</classname> Quotiert die einzelnen Teile für sich.
  206. Wird kein Beziehungsname für die Spalte angegeben, dann wird der Beziehungsname der
  207. Tabelle der aktuellen <methodname>from()</methodname> Methode verwendet.
  208. </para>
  209. <example id="zend.db.select.building.columns.example">
  210. <title>Beispiele für das Angeben von Spalten</title>
  211. <programlisting language="php"><![CDATA[
  212. // Erzeugt diese Anfrage:
  213. // SELECT p."product_id", p."product_name"
  214. // FROM "products" AS p
  215. $select = $db->select()
  216. ->from(array('p' => 'products'),
  217. array('product_id', 'product_name'));
  218. // Erzeugt dieselbe Anfrage, Angabe von Beziehungsnamen:
  219. // SELECT p."product_id", p."product_name"
  220. // FROM "products" AS p
  221. $select = $db->select()
  222. ->from(array('p' => 'products'),
  223. array('p.product_id', 'p.product_name'));
  224. // Erzeugt diese Anfrage mit einem Alias für eine Spalte:
  225. // SELECT p."product_id" AS prodno, p."product_name"
  226. // FROM "products" AS p
  227. $select = $db->select()
  228. ->from(array('p' => 'products'),
  229. array('prodno' => 'product_id', 'product_name'));
  230. ]]></programlisting>
  231. </example>
  232. </sect3>
  233. <sect3 id="zend.db.select.building.columns-expr">
  234. <title>Hinzufügen von Spalten mit Expressions</title>
  235. <para>
  236. Spalten in einer <acronym>SQL</acronym> Anfrage sind manchmal Expressions, keine
  237. einfachen Spaltennamen einer Tabelle. Expressions dürfen keine Beziehungsnamen oder
  238. Quotierungen bekommen. Wenn der Spaltenstring runde Klammern enthält erkennt
  239. <classname>Zend_Db_Select</classname> dies als eine Expression.
  240. </para>
  241. <para>
  242. Es kann auch ein Objekt des Typs <classname>Zend_Db_Expr</classname> erzeugt werden
  243. um zu verhindern das ein String wie ein Spaltenname behandelt wird.
  244. <classname>Zend_Db_Expr</classname> ist eine Minimalklasse die einen String enthält.
  245. <classname>Zend_Db_Select</classname> erkennt Objekte des Typs
  246. <classname>Zend_Db_Expr</classname> und konvertiert diese in Strings, nimmt aber
  247. keine Änderungen daran vor, wie Quotierung oder Beziehungsnamen.
  248. </para>
  249. <note>
  250. <para>
  251. Benutzung von <classname>Zend_Db_Expr</classname> für Spaltennamen ist nicht
  252. nötig wenn Spaltennamen Expressions runde Klammern enthalten.
  253. <classname>Zend_Db_Select</classname> erkennt diese und behandelt den String als
  254. eine Expression und lässt Quotierung und Beziehungsnamen aus.
  255. </para>
  256. </note>
  257. <example id="zend.db.select.building.columns-expr.example">
  258. <title>Beispiel für das angeben von Spaltennamen, die Expressions enthalten</title>
  259. <programlisting language="php"><![CDATA[
  260. // Erzeugt diese Anfrage:
  261. // SELECT p."product_id", LOWER(product_name)
  262. // FROM "products" AS p
  263. // Eine Expression eingeschlossen von runden Klammern wird zu Zend_Db_Expr.
  264. $select = $db->select()
  265. ->from(array('p' => 'products'),
  266. array('product_id', 'LOWER(product_name)'));
  267. // Erzeugt diese Anfrage:
  268. // SELECT p."product_id", (p.cost * 1.08) AS cost_plus_tax
  269. // FROM "products" AS p
  270. $select = $db->select()
  271. ->from(array('p' => 'products'),
  272. array('product_id',
  273. 'cost_plus_tax' => '(p.cost * 1.08)'));
  274. // Erzeugt diese Anfrage unter ausdrücklicher Verwendung von Zend_Db_Expr:
  275. // SELECT p."product_id", p.cost * 1.08 AS cost_plus_tax
  276. // FROM "products" AS p
  277. $select = $db->select()
  278. ->from(array('p' => 'products'),
  279. array('product_id',
  280. 'cost_plus_tax' =>
  281. new Zend_Db_Expr('p.cost * 1.08'))
  282. );
  283. ]]></programlisting>
  284. </example>
  285. <para>
  286. In den oben stehenden Fällen ändern <classname>Zend_Db_Select</classname> den String
  287. nicht mit Beziehungsnamen oder Bezeichnerquotierung. Wenn diese Änderungen notwendig
  288. sein sollten um doppeldeutigkeiten auf zu lösen, muss dies manuell am String
  289. geändert werden.
  290. </para>
  291. <para>
  292. Wenn die Spaltennamen aus <acronym>SQL</acronym> Schlüsselwörtern besteht oder
  293. spezielle Zeichen enthält sollte die <methodname>quoteIdentifier()</methodname>
  294. Methode verwendet werden und der Rückgabewert in den String eingefügt werden. Die
  295. <methodname>quoteIdentifier()</methodname> Methode verwendet <acronym>SQL</acronym>
  296. Quotierung um Bezeichner abzugrenzen, wodurch klar wird, das es sich um einen
  297. Bezeichner für eine Tabelle oder Spalte handelt, und nicht um einem anderen Teil der
  298. <acronym>SQL</acronym> Syntax.
  299. </para>
  300. <para>
  301. Der Code wird Datenbank unabhängiger wenn die
  302. <methodname>quoteIdentifier()</methodname> Methode anstelle von direkter Eingabe
  303. der Quotierungszeichen verwendet wird, da einige <acronym>RDBMS</acronym> Marken
  304. nicht-Standard Symbole für die Quotierung von Bezeichnern verwenden. Die
  305. <methodname>quoteIdentifier()</methodname> Methode wählt die passenden
  306. Quotierungssymbole für den Adaptertyp aus. Die
  307. <methodname>quoteIdentifier()</methodname> Methode ersetzt außerdem alle
  308. Quotierungszeichen innerhalb des Bezeichners.
  309. </para>
  310. <example id="zend.db.select.building.columns-quoteid.example">
  311. <title>Beispiel für die Quotierung von Spalten in einer Expression</title>
  312. <programlisting language="php"><![CDATA[
  313. // Erzeugt folgende Anfrage und Quotiert dabei einen Spaltennamen
  314. // "from" in der Expression:
  315. // SELECT p."from" + 10 AS origin
  316. // FROM "products" AS p
  317. $select = $db->select()
  318. ->from(array('p' => 'products'),
  319. array('origin' =>
  320. '(p.' . $db->quoteIdentifier('from') . ' + 10)')
  321. );
  322. ]]></programlisting>
  323. </example>
  324. </sect3>
  325. <sect3 id="zend.db.select.building.columns-atomic">
  326. <title>Spalten zu einer existierenden FROM oder JOIN Tabelle hinzufügen</title>
  327. <para>
  328. Es kann Fälle geben wo es gewünscht ist Spalten zu einer bestehenden FROM oder JOIN
  329. Tabelle hinzuzufügen nachdem diese Methoden aufgerufen wurde. Die
  330. <methodname>columns()</methodname> Methode erlaubt es spezifische Spalten an jedem
  331. Punkt hinzuzufügen bevor die Abfrage aufgeführt wird. Die Spalte kann entweder als
  332. String oder <classname>Zend_Db_Expr</classname> oder als Array dieser Elemente
  333. angegeben werden. Das zweite Argument dieser Methode kann unterdrückt werden, was
  334. impliziert das die Spalten zu der FROM Tabelle hinzugefügt werden sollen,
  335. andernfall muß ein bestehender Korrelationsname verwendet werden.
  336. </para>
  337. <example id="zend.db.select.building.columns-atomic.example">
  338. <title>Beispiel für das Hinzufügen von Spalten mit der columns() Methode</title>
  339. <programlisting language="php"><![CDATA[
  340. // Diese Abfrage bauen:
  341. // SELECT p."product_id", p."product_name"
  342. // FROM "products" AS p
  343. $select = $db->select()
  344. ->from(array('p' => 'products'), 'product_id')
  345. ->columns('product_name');
  346. // Die selbe Abfrage bauen, durch spezifizierung der Korrelationsnamen:
  347. // SELECT p."product_id", p."product_name"
  348. // FROM "products" AS p
  349. $select = $db->select()
  350. ->from(array('p' => 'products'), 'p.product_id')
  351. ->columns('product_name', 'p');
  352. // Alternativ kann columns('p.product_name') verwendet werden
  353. ]]></programlisting>
  354. </example>
  355. </sect3>
  356. <sect3 id="zend.db.select.building.join">
  357. <title>Hinzufügen einer weiteren Tabelle zu der Anfrage mit JOIN</title>
  358. <para>
  359. Viele nützliche Anfragen benötigen ein <acronym>JOIN</acronym> um mehrere Spalten
  360. verschiedener Tabellen miteinander zu kombinieren. Tabellen können zu einer
  361. <classname>Zend_Db_Select</classname> Anfrage mit der
  362. <methodname>join()</methodname> Methode hinzugefügt werden. Die Nutzung dieser
  363. Methode ist ähnlich der <methodname>from()</methodname> Methode, außer das in den
  364. meisten Fällen zusätzlich eine Join Bedingung angegeben werden kann.
  365. </para>
  366. <example id="zend.db.select.building.join.example">
  367. <title>Beispiel für die join() Methode</title>
  368. <programlisting language="php"><![CDATA[
  369. // Erzeugt diese Anfrage:
  370. // SELECT p."product_id", p."product_name", l.*
  371. // FROM "products" AS p JOIN "line_items" AS l
  372. // ON p.product_id = l.product_id
  373. $select = $db->select()
  374. ->from(array('p' => 'products'),
  375. array('product_id', 'product_name'))
  376. ->join(array('l' => 'line_items'),
  377. 'p.product_id = l.product_id');
  378. ]]></programlisting>
  379. </example>
  380. <para>
  381. Das zweite Argument der <methodname>join()</methodname> Methode ist ein String mit
  382. der Join Bedingung. Dies ist eine Exspression die Kriterien angibt, welche Zeilen
  383. in der einen Tabelle mit Zeilen einer anderen Tabelle verknüpft werden. Es können
  384. Beziehungsnamen in dieser Expression verwendet werden.
  385. </para>
  386. <note>
  387. <para>
  388. Es wird keine Quotierung auf die Expression für die Join Bedingung angewendet.
  389. Werden Spaltennamen verwendet, welche Quotierung benötigen, so muss
  390. <methodname>quoteIdentifier()</methodname> verwendet werden wenn der String für
  391. die Join Bedingung formuliert wird.
  392. </para>
  393. </note>
  394. <para>
  395. Das dritte Argument für <methodname>join()</methodname> ist ein Array von
  396. Spaltennahmen, entsprechend des Arrays der <methodname>from()</methodname> Methode.
  397. Der Standard ist ebenfalls "<code>*</code>" und unterstützt Beziehungsnamen,
  398. Expressions und <classname>Zend_Db_Expr</classname> in der gleichen Weise wie dem
  399. Array von Spaltennamen der <methodname>from()</methodname> Methode.
  400. </para>
  401. <para>
  402. Wenn keine Spalten einer Tabelle ausgewählt werden soll muss ein leeres Array für
  403. die Liste der Spaltennamen übergeben werden. Diese Nutzung funktioniert ebenfalls
  404. in der <methodname>from()</methodname> Methode, aber normalerweise werden einige
  405. Spalten der primären Tabelle in den Anfragen benötigt, während möglicherweise keine
  406. Spalten der verbundenen Tabelle ausgewählt werden sollen.
  407. </para>
  408. <example id="zend.db.select.building.join.example-no-columns">
  409. <title>Beispiel für das Angeben keiner Spalten</title>
  410. <programlisting language="php"><![CDATA[
  411. // Erzeugt diese Anfrage:
  412. // SELECT p."product_id", p."product_name"
  413. // FROM "products" AS p JOIN "line_items" AS l
  414. // ON p.product_id = l.product_id
  415. $select = $db->select()
  416. ->from(array('p' => 'products'),
  417. array('product_id', 'product_name'))
  418. ->join(array('l' => 'line_items'),
  419. 'p.product_id = l.product_id',
  420. array() ); // leere Liste von Spalten
  421. ]]></programlisting>
  422. <para>
  423. Zu beachten ist das leere <methodname>array()</methodname> in dem oben
  424. stehenden Beispiel, am Stelle einer Liste von Spalten der verbundenen Tabelle.
  425. </para>
  426. </example>
  427. <para>
  428. <acronym>SQL</acronym> kennt verschiedene Typen von Joins. In der unten stehen Liste
  429. sind Methoden zu finden, für die verschiedenen Join Typen die
  430. <classname>Zend_Db_Select</classname> unterstützt.
  431. </para>
  432. <itemizedlist>
  433. <listitem>
  434. <para>
  435. <command>INNER JOIN</command> mit den
  436. <methodname>join(tabelle, join, [spalten])</methodname> oder
  437. <methodname>joinInner(tabelle, join, [spalten])</methodname> Methoden.
  438. </para>
  439. <para>
  440. Dies wird der gebräuchlichste Typ von Join sein. Zeilen jeder Tabelle
  441. werden mit Hilfe der angegebenen Join Bedingung verglichen. Der
  442. Ergebnissatz enthält nur die Zeilen die der Join Bedingungen entsprechen.
  443. Der Ergebnissatz kann leer sein, wenn keine Zeile die Bedingung erfüllt.
  444. </para>
  445. <para>
  446. Alle <acronym>RDBMS</acronym> Marken unterstützen diesen Join Typ.
  447. </para>
  448. </listitem>
  449. <listitem>
  450. <para>
  451. <command>LEFT JOIN</command> mit der
  452. <methodname>joinLeft(tabelle, bedingung, [spalten])</methodname> Methode.
  453. </para>
  454. <para>
  455. Alle Zeilen der links vom Operanden stehenden Tabelle sind enthalten,
  456. passende Zeilen der rechts stehenden Tabelle sind ebenfalls enthalten. Die
  457. Spalten der rechts stehenden Tabelle werden mit <constant>NULL</constant>
  458. aufgefüllt, wenn keine zu der linken Tabelle passenden Zeilen existieren.
  459. </para>
  460. <para>
  461. Alle <acronym>RDBMS</acronym> Marken unterstützen diesen Join Typ.
  462. </para>
  463. </listitem>
  464. <listitem>
  465. <para>
  466. <command>RIGHT JOIN</command> mit der
  467. <methodname>joinRight(tabelle, bedingung, [spalten])</methodname> Methode.
  468. </para>
  469. <para>
  470. Right Outer Join ist das Gegenstück zu Left Outer Join. Alle Zeilen der
  471. rechts vom Operanden stehenden Tabelle sind enthalten, passende Zeilen der
  472. links stehenden Tabelle sind ebenfalls enthalten. Die Spalten der links
  473. stehenden Tabelle werden mit <constant>NULL</constant> aufgefüllt, wenn
  474. keine zu der rechten Tabelle passenden Zeilen existieren.
  475. </para>
  476. <para>
  477. Einige <acronym>RDBMS</acronym> Marken unterstützen diesen Join Typ nicht,
  478. aber grundsätzlich kann jeder Right Join durch einen Left Join mit
  479. umgekehrter Sortierung der Tabellen dargestellt werden.
  480. </para>
  481. </listitem>
  482. <listitem>
  483. <para>
  484. <command>FULL JOIN</command> mit der
  485. <methodname>joinFull(tabelle, bedingung, [spalten])</methodname> Methode.
  486. </para>
  487. <para>
  488. Ein Full Outer Join ist wie eine Kombination eines Left Outer Join mit
  489. einem Right Outer Join. Alle Zeilen beider Tabellen sind enthalten, gepaart
  490. miteinander in der gleichen Zeile des Ergebnissatzes wenn die Join
  491. Bedingung erfüllt wird, oder wenn nicht, mit <constant>NULL</constant>'s an
  492. Stelle der Spalten der anderen Tabelle.
  493. </para>
  494. <para>
  495. Einige <acronym>RDBMS</acronym> Marken unterstützen diesen Join Typ nicht.
  496. </para>
  497. </listitem>
  498. <listitem>
  499. <para>
  500. <command>CROSS JOIN</command> mit der
  501. <methodname>joinCross(tabelle, [spalten])</methodname> Methode.
  502. </para>
  503. <para>
  504. Ein Cross Join ist ein Kartesisches Produkt. Jede Zeile der ersten Tabelle
  505. wird mit jeder Zeile der zweiten Tabelle verbunden. Daher ist die Anzahl
  506. der Zeilen im Ergebnissatz gleich dem Produkt der Zeilenanzahlen der beiden
  507. Tabellen. Der Ergebnissatz kann mit Bedingungen einer WHERE Bedingung
  508. gefiltert werden. Ein Cross Join ist ähnlich der alten
  509. SQL-89 JOIN Syntax.
  510. </para>
  511. <para>
  512. Die <methodname>joinCross()</methodname> Methode hat keinen Parameter für
  513. die Join Bedingung. Einige <acronym>RDBMS</acronym> Marken unterstützen
  514. diesen Join Typ nicht.
  515. </para>
  516. </listitem>
  517. <listitem>
  518. <para>
  519. <command>NATURAL JOIN</command> mit der
  520. <methodname>joinNatural(tabelle, [spalten])</methodname> Methode.
  521. </para>
  522. <para>
  523. Ein Natural Join vergleicht alle Spalten die in beiden Tabellen mit
  524. gleichem Namen vorkommen. Der Vergleich prüft Gleichheit aller Spalten, ein
  525. Vergleich auf Ungleichheit ist kein Natural Join. Von dieser
  526. <acronym>API</acronym> werden nur Natural Inner Joins unterstützt, auch wenn
  527. <acronym>SQL</acronym> auch Natural Outer Joins erlaubt.
  528. </para>
  529. <para>
  530. Die <methodname>joinNatural()</methodname> Methode hat keinen Parameter für
  531. die Join Bedingung.
  532. </para>
  533. </listitem>
  534. </itemizedlist>
  535. <para>
  536. Zusätzlich zu diesen Join Methoden können Abfragen durch Verwendung der JoinUsing
  537. Methoden vereinfacht werden. Statt das eine komplette Definition des Joins
  538. angegeben wird, kann einfach der Spaltenname übergeben werden auf welchem gejoint
  539. werden soll und das <classname>Zend_Db_Select</classname> Objekt vervollständigt die
  540. Bedingung alleine.
  541. </para>
  542. <example id="zend.db.select.building.joinusing.example">
  543. <title>Beispiel für die joinUsing() Methode</title>
  544. <programlisting language="php"><![CDATA[
  545. // Erzeugt diese Abfrage
  546. // SELECT *
  547. // FROM "table1"
  548. // JOIN "table2"
  549. // ON "table1".column1 = "table2".column1
  550. // WHERE column2 = 'foo'
  551. $select = $db->select()
  552. ->from('table1')
  553. ->joinUsing('table2', 'column1')
  554. ->where('column2 = ?', 'foo');
  555. ]]></programlisting>
  556. </example>
  557. <para>
  558. Jede der anwendbaren Join Methoden in der <classname>Zend_Db_Select</classname>
  559. Komponente hat eine entsprechende 'using' Methode.
  560. </para>
  561. <itemizedlist>
  562. <listitem>
  563. <para>
  564. <methodname>joinUsing(table, join, [columns])</methodname> und
  565. <methodname>joinInnerUsing(table, join, [columns])</methodname>
  566. </para>
  567. </listitem>
  568. <listitem>
  569. <para>
  570. <methodname>joinLeftUsing(table, join, [columns])</methodname>
  571. </para>
  572. </listitem>
  573. <listitem>
  574. <para>
  575. <methodname>joinRightUsing(table, join, [columns])</methodname>
  576. </para>
  577. </listitem>
  578. <listitem>
  579. <para>
  580. <methodname>joinFullUsing(table, join, [columns])</methodname>
  581. </para>
  582. </listitem>
  583. </itemizedlist>
  584. </sect3>
  585. <sect3 id="zend.db.select.building.where">
  586. <title>Hinzufügen eines WHERE Abschnitts</title>
  587. <para>
  588. Es können Kriterien die den Ergebnissatz einschränken mit der
  589. <methodname>where()</methodname> Methode angegeben werden. Das erste Argument
  590. dieser Methode ist eine <acronym>SQL</acronym> Expression, welche in einer
  591. <acronym>SQL</acronym> <acronym>WHERE</acronym> Klausel der Anfrage steht.
  592. </para>
  593. <example id="zend.db.select.building.where.example">
  594. <title>Beispiel für die where() Methode</title>
  595. <programlisting language="php"><![CDATA[
  596. // Erzeugt diese Anfrage:
  597. // SELECT product_id, product_name, price
  598. // FROM "products"
  599. // WHERE price > 100.00
  600. $select = $db->select()
  601. ->from('products',
  602. array('product_id', 'product_name', 'price'))
  603. ->where('price > 100.00');
  604. ]]></programlisting>
  605. </example>
  606. <note>
  607. <para>
  608. Auf Expressions die an <methodname>where()</methodname> oder
  609. <methodname>orWhere()</methodname> Methoden übergeben werden, wird keine
  610. Quotierung angewendet. Werden Spaltennamen verwendet die Quotiert werden
  611. müssen, so muss <methodname>quoteIdentifier()</methodname> verwendet werden
  612. wenn der String für die Bedingung formuliert wird.
  613. </para>
  614. </note>
  615. <para>
  616. Das zweite Argument der <methodname>where()</methodname> Methode ist optional. Es
  617. ist ein Wert der in die Expression eingesetzt wird.
  618. <classname>Zend_Db_Select</classname> Quotiert den Wert und ersetzt ihn für ein
  619. Fragezeichen ("<code>?</code>") in der Expression.
  620. </para>
  621. <example id="zend.db.select.building.where.example-param">
  622. <title>Beispiel für einen Parameter in der where() Methode</title>
  623. <programlisting language="php"><![CDATA[
  624. // Erzeugt diese Anfrage:
  625. // SELECT product_id, product_name, price
  626. // FROM "products"
  627. // WHERE (price > 100.00)
  628. $minimumPrice = 100;
  629. $select = $db->select()
  630. ->from('products',
  631. array('product_id', 'product_name', 'price'))
  632. ->where('price > ?', $minimumPrice);
  633. ]]></programlisting>
  634. </example>
  635. <para>
  636. Man kann als zweiten Parameter ein Array an die <methodname>where()</methodname>
  637. Methode übergeben wenn der SQL IN Operator verwendet wird.
  638. </para>
  639. <example id="zend.db.select.building.where.example-array">
  640. <title>Beispiel eines Array Parameters in der where() Methode</title>
  641. <programlisting language="php"><![CDATA[
  642. // Diese Abrage wird gebaut:
  643. // SELECT product_id, product_name, price
  644. // FROM "products"
  645. // WHERE (product_id IN (1, 2, 3))
  646. $productIds = array(1, 2, 3);
  647. $select = $db->select()
  648. ->from('products',
  649. array('product_id', 'product_name', 'price'))
  650. ->where('product_id IN (?)', $productIds);
  651. ]]></programlisting>
  652. </example>
  653. <para>
  654. Die <methodname>where()</methodname> Methode kann mehrere Male in dem selben
  655. <classname>Zend_Db_Select</classname> Objekt aufgerufen werden. Die daraus folgenden
  656. Anfrage kombiniert die unterschiedlichen Ausdrücke unter Benutzung von
  657. <acronym>AND</acronym> zwischen ihnen.
  658. </para>
  659. <example id="zend.db.select.building.where.example-and">
  660. <title>Beispiel für mehrfach Aufruf der where() Methode</title>
  661. <programlisting language="php"><![CDATA[
  662. // Erzeugt diese Anfrage:
  663. // SELECT product_id, product_name, price
  664. // FROM "products"
  665. // WHERE (price > 100.00)
  666. // AND (price < 500.00)
  667. $minimumPrice = 100;
  668. $maximumPrice = 500;
  669. $select = $db->select()
  670. ->from('products',
  671. array('product_id', 'product_name', 'price'))
  672. ->where('price > ?', $minimumPrice)
  673. ->where('price < ?', $maximumPrice);
  674. ]]></programlisting>
  675. </example>
  676. <para>
  677. Wenn mehrere Ausdrücke mit <acronym>OR</acronym> verknüpft werden sollen kann die
  678. <methodname>orWhere()</methodname> Methode verwendet werden. Sie wird genauso
  679. benutzt wie die <methodname>where()</methodname> Methode, außer das dem angegebene
  680. Ausdruck ein <acronym>OR</acronym> vorangestellt wird, anstelle eines
  681. <acronym>AND</acronym>.
  682. </para>
  683. <example id="zend.db.select.building.where.example-or">
  684. <title>Beispiel für die orWhere() Methode</title>
  685. <programlisting language="php"><![CDATA[
  686. // Erzeugt diese Anfrage:
  687. // SELECT product_id, product_name, price
  688. // FROM "products"
  689. // WHERE (price < 100.00)
  690. // OR (price > 500.00)
  691. $minimumPrice = 100;
  692. $maximumPrice = 500;
  693. $select = $db->select()
  694. ->from('products',
  695. array('product_id', 'product_name', 'price'))
  696. ->where('price < ?', $minimumPrice)
  697. ->orWhere('price > ?', $maximumPrice);
  698. ]]></programlisting>
  699. </example>
  700. <para>
  701. <classname>Zend_Db_Select</classname> klammert Expressions automatisch mit runden
  702. Klammern ein wenn sie mit der <methodname>where()</methodname> oder
  703. <methodname>orWhere()</methodname> Methode angegeben wurden. Dies hilft sicher zu
  704. stellen dass das voranstellen von Boolean Operatoren keine unerwarteten Ergebnisse
  705. nach sich zieht.
  706. </para>
  707. <example id="zend.db.select.building.where.example-parens">
  708. <title>Beispiel für das Einklammern von Boolean Expressions</title>
  709. <programlisting language="php"><![CDATA[
  710. // Erzeugt diese Anfrage:
  711. // SELECT product_id, product_name, price
  712. // FROM "products"
  713. // WHERE (price < 100.00 OR price > 500.00)
  714. // AND (product_name = 'Apple')
  715. $minimumPrice = 100;
  716. $maximumPrice = 500;
  717. $prod = 'Apple';
  718. $select = $db->select()
  719. ->from('products',
  720. array('product_id', 'product_name', 'price'))
  721. ->where("price < $minimumPrice OR price > $maximumPrice")
  722. ->where('product_name = ?', $prod);
  723. ]]></programlisting>
  724. </example>
  725. <para>
  726. In dem oben stehenden Beispiel währen die Ergebnisse ohne den Klammern ziemlich
  727. anders, weil <acronym>AND</acronym> eine höhere Priorität als <acronym>OR</acronym>
  728. hat. <classname>Zend_Db_Select</classname> erzeugt runde Klammern wodurch jede
  729. Expression von aufeinander folgenden Aufrufen der <methodname>where()</methodname>
  730. Methode fester binden als das <acronym>AND</acronym> welches die Expressions
  731. kombiniert.
  732. </para>
  733. </sect3>
  734. <sect3 id="zend.db.select.building.group">
  735. <title>Hinzufügen eines GROUP BY Abschnitts</title>
  736. <para>
  737. In <acronym>SQL</acronym> ermöglicht der <command>GROUP BY</command> Abschnitt die
  738. Zeilenzahl des Ergebnissatzes auf eine Zeile pro eindeutigem Wert der Spalte(n),
  739. welche in dem <command>GROUP BY</command> Abschnitt benannt sind, einzuschränken.
  740. </para>
  741. <para>
  742. In <classname>Zend_Db_Select</classname> können diese Spalte(n) mit der
  743. <methodname>group()</methodname> Methode angegeben werden. Das Argument der Methode
  744. ist ein Spaltenname oder ein Array von Spaltennamen, welche im
  745. <command>GROUP BY</command> Abschnitt stehen sollen.
  746. </para>
  747. <example id="zend.db.select.building.group.example">
  748. <title>Beispiel für die group() Methode</title>
  749. <programlisting language="php"><![CDATA[
  750. // Erzeugt diese Anfrage:
  751. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  752. // FROM "products" AS p JOIN "line_items" AS l
  753. // ON p.product_id = l.product_id
  754. // GROUP BY p.product_id
  755. $select = $db->select()
  756. ->from(array('p' => 'products'),
  757. array('product_id'))
  758. ->join(array('l' => 'line_items'),
  759. 'p.product_id = l.product_id',
  760. array('line_items_per_product' => 'COUNT(*)'))
  761. ->group('p.product_id');
  762. ]]></programlisting>
  763. </example>
  764. <para>
  765. Wie in dem Array von Spaltennamen der <methodname>from()</methodname> Methode, so
  766. können auch hier Beziehungsnamen in den Strings der Spaltennamen verwendet werden,
  767. und der Spaltenname wird als Bezeichner Quotiert, wenn er nicht in runden Klammern
  768. steht oder ein Objekt des Typs <classname>Zend_Db_Expr</classname> ist.
  769. </para>
  770. </sect3>
  771. <sect3 id="zend.db.select.building.having">
  772. <title>Hinzufügen eines HAVING Abschnittes</title>
  773. <para>
  774. In <acronym>SQL</acronym> fügt der <constant>HAVING</constant> Abschnitt eine
  775. Beschränkungsbedingung für Gruppen von Zeilen ein. Dies ist ähnlich der
  776. Einschränkungsbedingungen auf Zeilen, des <constant>WHERE</constant> Abschnittes.
  777. Die beiden Abschnitte unterscheiden sich jedoch, denn die <constant>WHERE</constant>
  778. Bedingungen werden abgewendet bevor Gruppen definiert wurden. Im Gegensatz werden
  779. <constant>HAVING</constant> Bedingungen erst angewendet nach dem Gruppen definiert
  780. wurden.
  781. </para>
  782. <para>
  783. In <classname>Zend_Db_Select</classname> können Bedingungen für die Einschränkung
  784. von Gruppen mit der <methodname>having()</methodname> Methode angegeben werden. Die
  785. Nutzung ist ähnlich wie die der <methodname>where()</methodname> Methode. Das erste
  786. Argument ist ein String, welcher eine <acronym>SQL</acronym> Expression enthält. Das
  787. zweite Argument ist optional und wird verwendet um einen positionierten Parameter
  788. Platzhalter in der <acronym>SQL</acronym> Expression zu ersetzen. Expressions die
  789. durch mehrfaches Aufrufen der <methodname>having()</methodname> Methode erzeugt
  790. wurden werden mit dem Boolean <constant>AND</constant> Operator verknüpft, oder mit
  791. dem <code>OR</code> Operator wenn die <methodname>orHaving()</methodname> Methode
  792. verwendet wird.
  793. </para>
  794. <example id="zend.db.select.building.having.example">
  795. <title>Beispiel für die having() Methode</title>
  796. <programlisting language="php"><![CDATA[
  797. // Erzeugt diese Anfrage:
  798. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  799. // FROM "products" AS p JOIN "line_items" AS l
  800. // ON p.product_id = l.product_id
  801. // GROUP BY p.product_id
  802. // HAVING line_items_per_product > 10
  803. $select = $db->select()
  804. ->from(array('p' => 'products'),
  805. array('product_id'))
  806. ->join(array('l' => 'line_items'),
  807. 'p.product_id = l.product_id',
  808. array('line_items_per_product' => 'COUNT(*)'))
  809. ->group('p.product_id')
  810. ->having('line_items_per_product > 10');
  811. ]]></programlisting>
  812. </example>
  813. <note>
  814. <para>
  815. Es wird keine Quotierung bei den Expressions welche an die
  816. <methodname>having()</methodname> oder <methodname>orHaving()</methodname>
  817. Methoden übergeben werden. Werden Spaltennamen verwendet die Quotiert werden
  818. müssen, so muss <methodname>quoteIdentifier()</methodname> verwendet werden
  819. wenn der String für die Bedingung formuliert wird.
  820. </para>
  821. </note>
  822. </sect3>
  823. <sect3 id="zend.db.select.building.order">
  824. <title>Hinzufügen eines ORDER BY Abschnitts</title>
  825. <para>
  826. In <acronym>SQL</acronym> gibt der <code>ORDER BY</code> Abschnitt eine oder mehrere
  827. Spalten oder Expressions an, wonach ein Ergebnissatz sortiert wird. Wenn mehrere
  828. Spalten angegeben sind, werden die sekundären Spalten verwendet um "ties"
  829. aufzulösen; die Sortierung wird von sekundären Spalten bestimmt, wenn vorhergehende
  830. Spalten identische Werte enthalten. Die standard Sortierung ist vom kleinsten zum
  831. größten Wert. Dieses Verhalten kann umgekehrt werden, wenn das Schlüsselwort
  832. <constant>DESC</constant> nach der Spalte angegeben wird.
  833. </para>
  834. <para>
  835. In <classname>Zend_Db_Select</classname> kann die <methodname>order()</methodname>
  836. Methode verwendet werden um Spalten, oder Arrays von Spalten, anzugeben, nach denen
  837. sortiert werden soll. Jedes Element des Arrays ist ein String, welcher die Spalte
  838. benennt. Optional kann auf den Namen eines der Schlüsselwörter
  839. <constant>ASC</constant> <constant>DESC</constant> folgen, abgetrennt durch ein
  840. Leerzeichen.
  841. </para>
  842. <para>
  843. Wie in den <methodname>from()</methodname> und <methodname>group()</methodname>
  844. Methoden, werden Spalten als Bezeichner Quotiert, wenn sie nicht von runden
  845. Klammern eingeschlossen oder vom Objekttyp <classname>Zend_Db_Expr</classname>
  846. sind.
  847. </para>
  848. <example id="zend.db.select.building.order.example">
  849. <title>Beispiel für die order() Methode</title>
  850. <programlisting language="php"><![CDATA[
  851. // Erzeugt diese Anfrage:
  852. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  853. // FROM "products" AS p JOIN "line_items" AS l
  854. // ON p.product_id = l.product_id
  855. // GROUP BY p.product_id
  856. // ORDER BY "line_items_per_product" DESC, "product_id"
  857. $select = $db->select()
  858. ->from(array('p' => 'products'),
  859. array('product_id'))
  860. ->join(array('l' => 'line_items'),
  861. 'p.product_id = l.product_id',
  862. array('line_items_per_product' => 'COUNT(*)'))
  863. ->group('p.product_id')
  864. ->order(array('line_items_per_product DESC',
  865. 'product_id'));
  866. ]]></programlisting>
  867. </example>
  868. </sect3>
  869. <sect3 id="zend.db.select.building.limit">
  870. <title>Hinzufügen eines LIMIT Abschnitts</title>
  871. <para>
  872. Einige <acronym>RDBMS</acronym> Marken erweitern <acronym>SQL</acronym> mit einem
  873. Anfrage Abschnitt, bekannt als <constant>LIMIT</constant> Abschnitt. Dieser
  874. Abschnitt begrenzt die Anzahl der Zeilen in einem Ergebnissatz auf die angegebene
  875. Höchstanzahl. Es kann ebenfalls angegeben werden, dass eine Anzahl von Zeilen
  876. ausgelassen werden soll. Dieses Feature erlaubt es eine Untermenge des
  877. Ergebnissatzes zu holen, zum Beispiel wenn Anfrage Ergebnisse auf aufeinander
  878. folgenden Seiten angezeigt werden sollen.
  879. </para>
  880. <para>
  881. In <classname>Zend_Db_Select</classname> kann die <methodname>limit()</methodname>
  882. Methode verwendet werden um die Anzahl von Zeilen und die Anzahl der auszulassenden
  883. Spalten anzugeben. Das <emphasis>erste</emphasis> Argument dieser Methode ist die
  884. gewünschte Anzahl an Zeilen. Das <emphasis>zweite</emphasis> Argument gibt die
  885. Anzahl der auszulassenden Zeilen an.
  886. </para>
  887. <example id="zend.db.select.building.limit.example">
  888. <title>Beispiel für die limit() Methode</title>
  889. <programlisting language="php"><![CDATA[
  890. // Erzeugt diese Anfrage:
  891. // SELECT p."product_id", p."product_name"
  892. // FROM "products" AS p
  893. // LIMIT 10, 20
  894. // Identisch zu:
  895. // SELECT p."product_id", p."product_name"
  896. // FROM "products" AS p
  897. // LIMIT 20 OFFSET 10
  898. $select = $db->select()
  899. ->from(array('p' => 'products'),
  900. array('product_id', 'product_name'))
  901. ->limit(20, 10);
  902. ]]></programlisting>
  903. </example>
  904. <note>
  905. <para>
  906. Die <constant>LIMIT</constant> Syntax wird nicht von allen
  907. <acronym>RDBMS</acronym> Marken unterstützt. Einige <acronym>RDBMS</acronym>
  908. benötigen eine unterschiedliche Syntax für eine ähnliche Funktionalität. Jede
  909. <classname>Zend_Db_Adapter_Abstract</classname> Klasse enthält eine Methode um
  910. für das <acronym>RDBMS</acronym> passende <acronym>SQL</acronym> Syntax zu
  911. erzeugen.
  912. </para>
  913. </note>
  914. <para>
  915. Die <methodname>limitPage()</methodname> Methode kann als alternativer Weg
  916. verwendet werden um Zeilenanzahl und Offset zu spezifizieren. Diese Methode erlaubt
  917. den Ergebnissatz auf einen Subset, aus einer Serie von Subsets mit Reihen einer
  918. fixe Länge, auf dem totalen Ergebnissatz der Abfrage, zu limitieren. In anderen
  919. Worten, spezifiziert man die Länge einer Seite ("page") von Ergebnissen, und die
  920. ordinale Anzahl an Ergebnissen einer einzelnen Seite, die als von der Abfrage
  921. zurück gegeben werden sollen. Die Seitennummer ist das erste Argument der
  922. <methodname>limitPage()</methodname> Methode, und die Seitenlänge ist das zweite
  923. Argument. Beide Argumente werden benötigt; sie haben keinen Standardwert.
  924. </para>
  925. <example id="zend.db.select.building.limit.example2">
  926. <title>Beispiel der limitPage() Methode</title>
  927. <programlisting language="php"><![CDATA[
  928. // Erstelle diese Abfrage:
  929. // SELECT p."product_id", p."product_name"
  930. // FROM "products" AS p
  931. // LIMIT 10, 20
  932. $select = $db->select()
  933. ->from(array('p' => 'products'),
  934. array('product_id', 'product_name'))
  935. ->limitPage(2, 10);
  936. ]]></programlisting>
  937. </example>
  938. </sect3>
  939. <sect3 id="zend.db.select.building.distinct">
  940. <title>Hinzufügen des DISTINCT Anfragewandlers</title>
  941. <para>
  942. Die <methodname>distinct()</methodname> Methode ermöglicht es
  943. <constant>DISTINCT</constant> Schlüsselworte in die <acronym>SQL</acronym> Syntax
  944. einzufügen.
  945. </para>
  946. <example id="zend.db.select.building.distinct.example">
  947. <title>Beispiel für die distinct() Methode</title>
  948. <programlisting language="php"><![CDATA[
  949. // Erzeugt diese Anfrage:
  950. // SELECT DISTINCT p."product_name"
  951. // FROM "products" AS p
  952. $select = $db->select()
  953. ->distinct()
  954. ->from(array('p' => 'products'), 'product_name');
  955. ]]></programlisting>
  956. </example>
  957. </sect3>
  958. <sect3 id="zend.db.select.building.for-update">
  959. <title>Hinzufügen des FOR UPDATE Anfragewandlers</title>
  960. <para>
  961. Die <methodname>forUpdate()</methodname> Methode ermöglicht es
  962. <code>FOR UPDATE</code> Schlüsselworte in die <acronym>SQL</acronym> Syntax
  963. einzufügen.
  964. </para>
  965. <example id="zend.db.select.building.for-update.example">
  966. <title>Beispiel der forUpdate() Methode</title>
  967. <programlisting language="php"><![CDATA[
  968. // Erzeugt diese Anfrage:
  969. // SELECT FOR UPDATE p.*
  970. // FROM "products" AS p
  971. $select = $db->select()
  972. ->forUpdate()
  973. ->from(array('p' => 'products'));
  974. ]]></programlisting>
  975. </example>
  976. </sect3>
  977. <sect3 id="zend.db.select.building.union">
  978. <title>Eine UNION Abfrage erstellen</title>
  979. <para>
  980. Man kann Union Abfragen mit <classname>Zend_Db_Select</classname> erstellen indem
  981. ein Array von <classname>Zend_Db_Select</classname> oder SQL Query Strings an die
  982. <methodname>union()</methodname> Methode übergeben wird. Als zweiter Parameter
  983. können die Konstanten <constant>Zend_Db_Select::SQL_UNION</constant> oder
  984. <constant>Zend_Db_Select::SQL_UNION_ALL</constant> übergeben werden um den Typ der
  985. Union zu spezifizieren den man ausführen will.
  986. </para>
  987. <example id="zend.db.select.building.union.example">
  988. <title>Beispiel der union() Methode</title>
  989. <programlisting language="php"><![CDATA[
  990. $sql1 = $db->select();
  991. $sql2 = "SELECT ...";
  992. $select = $db->select()
  993. ->union(array($sql1, $sql2))
  994. ->order("id");
  995. ]]></programlisting>
  996. </example>
  997. </sect3>
  998. </sect2>
  999. <sect2 id="zend.db.select.execute">
  1000. <title>Ausführen von SELECT Anfrage</title>
  1001. <para>
  1002. Dieser Abschnitt beschreibt wie Anfragen ausgeführt werden, die durch ein
  1003. <classname>Zend_Db_Select</classname> Objekt repräsentiert werden.
  1004. </para>
  1005. <sect3 id="zend.db.select.execute.query-adapter">
  1006. <title>Ausführen von Select Anfragen aus dem Db Adapter</title>
  1007. <para>
  1008. Die Anfrage, die durch das <classname>Zend_Db_Select</classname> Objekt
  1009. repräsentiert wird kann ausgeführt werden, indem sie als erstes Argument an die
  1010. <methodname>query()</methodname> Methode des
  1011. <classname>Zend_Db_Adapter_Abstract</classname> Objekts übergeben wird. Dabei wird
  1012. das <classname>Zend_Db_Select</classname> anstelle eines Strings verwendet.
  1013. </para>
  1014. <para>
  1015. Die <methodname>query()</methodname> Methode gibt ein Objekt vom Typ
  1016. <classname>Zend_Db_Statement</classname> oder PDOStatement
  1017. zurück, je nachdem welcher Adaptertyp verwendet wird.
  1018. </para>
  1019. <example id="zend.db.select.execute.query-adapter.example">
  1020. <title>Beispiel für die Nutzung der query() Methode des Db Adapters</title>
  1021. <programlisting language="php"><![CDATA[
  1022. $select = $db->select()
  1023. ->from('products');
  1024. $stmt = $db->query($select);
  1025. $result = $stmt->fetchAll();
  1026. ]]></programlisting>
  1027. </example>
  1028. </sect3>
  1029. <sect3 id="zend.db.select.execute.query-select">
  1030. <title>Ausführen von Select Anfragen mit dem objekt</title>
  1031. <para>
  1032. Als Alternative zur Nutzung der <methodname>query()</methodname> Methode des
  1033. Adapterobjekts kann auch die <methodname>query()</methodname> Methode des
  1034. <classname>Zend_Db_Select</classname> Objekts verwendet werden. Beide Methoden
  1035. geben ein Objekt vom Typ <classname>Zend_Db_Statement</classname> oder
  1036. PDOStatement zurück, je nachdem welcher Adaptertyp verwendet wird.
  1037. </para>
  1038. <example id="zend.db.select.execute.query-select.example">
  1039. <title>Beispiel für die Nutzung der query() Methode des Select Objekts</title>
  1040. <programlisting language="php"><![CDATA[
  1041. $select = $db->select()
  1042. ->from('products');
  1043. $stmt = $select->query();
  1044. $result = $stmt->fetchAll();
  1045. ]]></programlisting>
  1046. </example>
  1047. </sect3>
  1048. <sect3 id="zend.db.select.execute.tostring">
  1049. <title>Konvertieren eines Select Objekts in einen SQL String</title>
  1050. <para>
  1051. Wenn Zugriff zu auf eine String Repräsentante der <acronym>SQL</acronym> Anfrage,
  1052. entsprechend dem <classname>Zend_Db_Select</classname>, benötigt wird, kann die
  1053. <methodname>__toString()</methodname> Methode verwendet werden.
  1054. </para>
  1055. <example id="zend.db.select.execute.tostring.example">
  1056. <title>Beispiel für die __toString() Methode</title>
  1057. <programlisting language="php"><![CDATA[
  1058. $select = $db->select()
  1059. ->from('products');
  1060. $sql = $select->__toString();
  1061. echo "$sql\n";
  1062. // Ausgabe ist dieser String:
  1063. // SELECT * FROM "products"
  1064. ]]></programlisting>
  1065. </example>
  1066. </sect3>
  1067. </sect2>
  1068. <sect2 id="zend.db.select.other">
  1069. <title>Andere Methoden</title>
  1070. <para>
  1071. Dieser Abschnitt beschreibt andere Methoden der <classname>Zend_Db_Select</classname>
  1072. Klasse, welche bisher nicht beschrieben wurden: <methodname>getPart()</methodname> und
  1073. <methodname>reset()</methodname>.
  1074. </para>
  1075. <sect3 id="zend.db.select.other.get-part">
  1076. <title>Abfragen von Teilen des Select Objekts</title>
  1077. <para>
  1078. Die <methodname>getPart()</methodname> Methode gibt eine Repräsentante eines Teils
  1079. der <acronym>SQL</acronym> Anfrage zurück. Zum Beispiel kann diese Methode verwendet
  1080. werden um, ein Array von Expressions des <constant>WHERE</constant> Abschnitts, ein
  1081. Array von Spalten (oder Spalten Expressions) von <constant>SELECT</constant> oder
  1082. die Werte der Spaltenzahl und Auslassungen des <constant>LIMIT</constant>
  1083. Abschnitts, zu erhalten.
  1084. </para>
  1085. <para>
  1086. Die Rückgabe ist kein String der ein Fragment der <acronym>SQL</acronym> Syntax
  1087. enthält. Der Rückgabewert ist eine interne Repräsentante, was typischerweise eine
  1088. Arraystruktur ist, welche Werte und Expressions enthält. Jeder Teil der Anfrage hat
  1089. eine unterschiedliche Struktur.
  1090. </para>
  1091. <para>
  1092. Das einzige Argument der <methodname>getPart()</methodname> Methode ist ein String
  1093. der den zurück zu gebenden Teil der Anfrage bezeichnet. Zum Beispiel bezeichnet der
  1094. String <code>'from'</code> den Teil des Select Objekts, welcher Informationen über
  1095. den <constant>FROM</constant> Abschnitt, einschließlich verbundener Tabellen
  1096. enthält.
  1097. </para>
  1098. <para>
  1099. Die <classname>Zend_Db_Select</classname> Klasse definiert Konstanten die für Teile
  1100. der <acronym>SQL</acronym> Anfrage verwendet werden können. Es können die
  1101. Konstantendefinitionen oder die literalen Strings verwendet werden.
  1102. </para>
  1103. <table id="zend.db.select.other.get-part.table">
  1104. <title>Konstanten die von getPart() und reset() verwendet werden</title>
  1105. <tgroup cols="2">
  1106. <thead>
  1107. <row>
  1108. <entry>Konstante</entry>
  1109. <entry>String Wert</entry>
  1110. </row>
  1111. </thead>
  1112. <tbody>
  1113. <row>
  1114. <entry><constant>Zend_Db_Select::DISTINCT</constant></entry>
  1115. <entry><code>'distinct'</code></entry>
  1116. </row>
  1117. <row>
  1118. <entry><constant>Zend_Db_Select::FOR_UPDATE</constant></entry>
  1119. <entry><code>'forupdate'</code></entry>
  1120. </row>
  1121. <row>
  1122. <entry><constant>Zend_Db_Select::COLUMNS</constant></entry>
  1123. <entry><code>'columns'</code></entry>
  1124. </row>
  1125. <row>
  1126. <entry><constant>Zend_Db_Select::FROM</constant></entry>
  1127. <entry><code>'from'</code></entry>
  1128. </row>
  1129. <row>
  1130. <entry><constant>Zend_Db_Select::WHERE</constant></entry>
  1131. <entry><code>'where'</code></entry>
  1132. </row>
  1133. <row>
  1134. <entry><constant>Zend_Db_Select::GROUP</constant></entry>
  1135. <entry><code>'group'</code></entry>
  1136. </row>
  1137. <row>
  1138. <entry><constant>Zend_Db_Select::HAVING</constant></entry>
  1139. <entry><code>'having'</code></entry>
  1140. </row>
  1141. <row>
  1142. <entry><constant>Zend_Db_Select::ORDER</constant></entry>
  1143. <entry><code>'order'</code></entry>
  1144. </row>
  1145. <row>
  1146. <entry><constant>Zend_Db_Select::LIMIT_COUNT</constant></entry>
  1147. <entry><code>'limitcount'</code></entry>
  1148. </row>
  1149. <row>
  1150. <entry><constant>Zend_Db_Select::LIMIT_OFFSET</constant></entry>
  1151. <entry><code>'limitoffset'</code></entry>
  1152. </row>
  1153. </tbody>
  1154. </tgroup>
  1155. </table>
  1156. <example id="zend.db.select.other.get-part.example">
  1157. <title>Beispiel der getPart() Methode</title>
  1158. <programlisting language="php"><![CDATA[
  1159. $select = $db->select()
  1160. ->from('products')
  1161. ->order('product_id');
  1162. // Ein literaler String kann verwendet werden um den Abschnitt zu definieren
  1163. $orderData = $select->getPart( 'order' );
  1164. // Eine Konstante kann verwendet werden um den selben Abschnitt zu definieren
  1165. $orderData = $select->getPart( Zend_Db_Select::ORDER );
  1166. // Der zurückgegebene Wert kann eine Array Struktur sein, kein String.
  1167. // Jeder Abschnitt hat eine unterschiedliche Struktur.
  1168. print_r( $orderData );
  1169. ]]></programlisting>
  1170. </example>
  1171. </sect3>
  1172. <sect3 id="zend.db.select.other.reset">
  1173. <title>Zurücksetzen von Teilen des Select Objekts</title>
  1174. <para>
  1175. Die <methodname>reset()</methodname> Methode ermöglicht es einen angegebenen Teil
  1176. der <acronym>SQL</acronym> Anfrage zu löschen oder, wenn der Parameter ausgelassen
  1177. ist, alle Teile der <acronym>SQL</acronym> Anfrage zu löschen.
  1178. </para>
  1179. <para>
  1180. Das einzige Argument ist optional. Es kann der Teil der Anfrage angegeben werden,
  1181. der gelöscht werden soll, unter Nutzung des gleichen Strings wie er als Argument
  1182. der <methodname>getPart()</methodname> Methode verwendet wird. Der angegebene Teil
  1183. wird auf ein Standardwert zurück gesetzt.
  1184. </para>
  1185. <para>
  1186. Wenn der Parameter ausgelassen wird, setzt <methodname>reset()</methodname> alle
  1187. geänderten Teile auf einen Standardwert zurück. Dadurch ist das
  1188. <classname>Zend_Db_Select</classname> Objekt gleichwertig mit einem neuen Objekt,
  1189. wie wenn es gerade Instanziiert wurde.
  1190. </para>
  1191. <example id="zend.db.select.other.reset.example">
  1192. <title>Beispiel der reset() Methode</title>
  1193. <programlisting language="php"><![CDATA[
  1194. // Erzeugt diese Anfrage:
  1195. // SELECT p.*
  1196. // FROM "products" AS p
  1197. // ORDER BY "product_name"
  1198. $select = $db->select()
  1199. ->from(array('p' => 'products')
  1200. ->order('product_name');
  1201. // Geänderte Anforderungen, stattdessen sortiert nach einer anderen Spalte:
  1202. // SELECT p.*
  1203. // FROM "products" AS p
  1204. // ORDER BY "product_id"
  1205. // Lösche einen Abschnitt damit er neu defniert werden kann
  1206. $select->reset( Zend_Db_Select::ORDER );
  1207. // und definiere eine andere Spalte
  1208. $select->order('product_id');
  1209. // Lösche alle Abschnitte von der Abfrage
  1210. $select->reset();
  1211. ]]></programlisting>
  1212. </example>
  1213. </sect3>
  1214. </sect2>
  1215. </sect1>
  1216. <!--
  1217. vim:se ts=4 sw=4 et:
  1218. -->