Zend_Db_Select.xml 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.db.select">
  4. <title>Zend_Db_Select</title>
  5. <sect2 id="zend.db.select.introduction">
  6. <title>Wprowadzenie</title>
  7. <para>
  8. Obiekt <classname>Zend_Db_Select</classname> reprezentuje pojedyncze polecenie
  9. <acronym>SQL</acronym> <acronym>SELECT</acronym>. Klasa posiada metody służące do
  10. umieszczenia poszczególnych części zapytania. Za jej pomocą można zapisać elementy
  11. zapytania poprzez metody i struktur danych <acronym>PHP</acronym> a klasa sama
  12. tworzy poprawne polecenie <acronym>SQL</acronym>. Po zbudowaniu zapytania można go
  13. użyć tak jakby było napisane w postaci zwykłego łańcucha znaków.
  14. </para>
  15. <para>
  16. Wartość <classname>Zend_Db_Select</classname> zawiera się w poniższych cechach:
  17. </para>
  18. <itemizedlist>
  19. <listitem>
  20. <para>
  21. Metody obiektowe służące tworzeniu zapytań <acronym>SQL</acronym> krok po
  22. kroku;
  23. </para>
  24. </listitem>
  25. <listitem>
  26. <para>
  27. Poziom abstrakcji umożliwiający używanie określonych części zapytania
  28. <acronym>SQL</acronym> są w sposób niezależny od rodzaju bazy danych;
  29. </para>
  30. </listitem>
  31. <listitem>
  32. <para>
  33. Automatyczne umieszczanie identyfikatorów metadanych w cudzysłowach ułatwia
  34. używanie identyfikatorów zawierających zarezerwowane słowa i specjalne znaki
  35. <acronym>SQL</acronym>;
  36. </para>
  37. </listitem>
  38. <listitem>
  39. <para>
  40. Umieszczanie identyfikatorów i wartości w cudzysłowach pomaga ograniczyć
  41. ryzyko ataków wstrzykiwania kodu <acronym>SQL</acronym> (<acronym>SQL</acronym>
  42. injection);
  43. </para>
  44. </listitem>
  45. </itemizedlist>
  46. <para>
  47. Używanie <classname>Zend_Db_Select</classname> nie jest obowiązkowe. Dla najprostrzych
  48. zapytań SELECT z reguły łatwiej jest zapisać całe polecenie <acronym>SQL</acronym> w
  49. postaci łańcucha znaków i wywołać je za pomocą metod Adaptera takich jak
  50. <methodname>query()</methodname> lub <methodname>fetchAll()</methodname>. Użycie
  51. <classname>Zend_Db_Select</classname> jest przydatne jeśli zajdzie potrzeba połączenia
  52. części złożonego zapytania w kodzie np. w zależności od wystąpienia dodatkowych warunków
  53. logicznych.
  54. </para>
  55. </sect2>
  56. <sect2 id="zend.db.select.creating">
  57. <title>Tworzenie objektu Select</title>
  58. <para>
  59. Instancję klasy <classname>Zend_Db_Select</classname> można utworzyć poprzez metodę
  60. <methodname>select()</methodname> obiektu <classname>Zend_Db_Adapter_Abstract</classname>.
  61. </para>
  62. <example id="zend.db.select.creating.example-db">
  63. <title>Przykład metody select() adaptera bazy danych</title>
  64. <programlisting language="php"><![CDATA[
  65. $db = Zend_Db::factory( ...options... );
  66. $select = $db->select();
  67. ]]></programlisting>
  68. </example>
  69. <para>
  70. Innym sposobem utworzenia objektu <classname>Zend_Db_Select</classname> jest użycie
  71. konstruktora, podając adapter bazy danych w argumencie.
  72. </para>
  73. <example id="zend.db.select.creating.example-new">
  74. <title>Przykład tworzenia nowego obiektu Select</title>
  75. <programlisting language="php"><![CDATA[
  76. $db = Zend_Db::factory( ...options... );
  77. $select = new Zend_Db_Select($db);
  78. ]]></programlisting>
  79. </example>
  80. </sect2>
  81. <sect2 id="zend.db.select.building">
  82. <title>Tworzenie poleceń Select</title>
  83. <para>
  84. Budując zapytanie można dodawać jego części jedna po drugiej. Obiekt
  85. <classname>Zend_Db_Select</classname> posiada odrębne metody dla każdej klauzuli
  86. <acronym>SQL</acronym>.
  87. </para>
  88. <example id="zend.db.select.building.example">
  89. <title>Przykład użycia metod służących dodawaniu części zapytania</title>
  90. <programlisting language="php"><![CDATA[
  91. // Utworzenie objektu Zend_Db_Select
  92. $select = $db->select();
  93. // Dodanie klauzuli FROM
  94. $select->from( ...podanie tabel i kolumn... )
  95. // Dodanie klauzuli WHERE
  96. $select->where( ...podanie kryteriów ograniczenia... )
  97. // Dodanie klauzuli ORDER BY
  98. $select->order( ...podanie kryteriów sortowania... );
  99. ]]></programlisting>
  100. </example>
  101. <para>
  102. Większości metod obiektu <classname>Zend_Db_Select</classname> można używać za pomocą przyjaznego
  103. płynego interfejsu (fluent interface). Interfejs płynny oznacza, że każda z metod zwraca
  104. referencję do obiektu wywołującego więc można od razu użyć następnej metody.
  105. </para>
  106. <example id="zend.db.select.building.example-fluent">
  107. <title>Przykład użycia płynego interfejsu</title>
  108. <programlisting language="php"><![CDATA[
  109. $select = $db->select()
  110. ->from( ...podanie tabel i kolumn... )
  111. ->where( ...podanie kryteriów ograniczenia... )
  112. ->order( ...podanie kryteriów sortowania... );
  113. ]]></programlisting>
  114. </example>
  115. <para>
  116. Przykłady w tym rozdziale używają płynnego interfejsu ale zawsze można z niego zrezygnować.
  117. Często może się to okazać niezbędne w przypadku gdy należy wykonać operacje zgodne
  118. z logiką biznesową aplikacji przed umieszczeniem dodatkowej klauzuli w zapytaniu.
  119. </para>
  120. <sect3 id="zend.db.select.building.from">
  121. <title>Dodawanie klauzuli FROM</title>
  122. <para>
  123. Można wybrać tabelę dla zapytania używając metody <methodname>from()</methodname>.
  124. Aby tego dokonać należy podać nazwę tabeli jako łańcuch znaków.
  125. <classname>Zend_Db_Select</classname> umieszcza cudzysłowy wokół podanej nazwy, więc
  126. można używać znaków specjalnych.
  127. </para>
  128. <example id="zend.db.select.building.from.example">
  129. <title>Przykład używacia metody from()</title>
  130. <programlisting language="php"><![CDATA[
  131. // Utworzenie zapytania:
  132. // SELECT *
  133. // FROM "products"
  134. $select = $db->select()
  135. ->from( 'products' );
  136. ]]></programlisting>
  137. </example>
  138. <para>
  139. Można podać również nazwę korelacyjną (nazywaną również "aliasem tabeli") danej tabeli.
  140. Aby to zrobić w argumencie należy podać tablicę asocjacyjną, która będzie zawierała
  141. mapowanie nazwy aliasu na nazwę tabeli. W pozostałych częściach zapytania
  142. <acronym>SQL</acronym> będzie można używać tej nazwy zamiast tabeli. Jeśli dane zapytanie
  143. łączy wiele tabel <classname>Zend_Db_Select</classname> utworzy unikalne aliasy na
  144. podstawie prawdziwych nazw dla każdej tabeli dla której nie zrobi tego użytkownik.
  145. </para>
  146. <example id="zend.db.select.building.from.example-cname">
  147. <title>Przykład użycia aliasu</title>
  148. <programlisting language="php"><![CDATA[
  149. // Utworzenie zapytania:
  150. // SELECT p.*
  151. // FROM "products" AS p
  152. $select = $db->select()
  153. ->from( array('p' => 'products') );
  154. ]]></programlisting>
  155. </example>
  156. <para>
  157. Niektóre silniki bazy danych (<acronym>RDBMS</acronym>) wspierają podawanie nazw schematu
  158. przed nazwą tabeli. W takim przypadku należy podać nazwę tabeli jako
  159. "<code>nazwaSchematu.nazwaTabeli</code>" a <classname>Zend_Db_Select</classname>
  160. umieści w cudzysłowach każdą z części takiej nazwy indywidualnie. Można też podać
  161. nazwę schematu oddzielnie. Nazwa schematu podana przy nazwie tabeli ma pierwszeństwo
  162. wobec nazwy schematu podanej osobno (jeśli obie występują).
  163. </para>
  164. <example id="zend.db.select.building.from.example-schema">
  165. <title>Przykład podawania nazwy schematu</title>
  166. <programlisting language="php"><![CDATA[
  167. // Utworzenie zapytania:
  168. // SELECT *
  169. // FROM "myschema"."products"
  170. $select = $db->select()
  171. ->from( 'myschema.products' );
  172. // lub
  173. $select = $db->select()
  174. ->from('products', '*', 'myschema');
  175. ]]></programlisting>
  176. </example>
  177. </sect3>
  178. <sect3 id="zend.db.select.building.columns">
  179. <title>Dodawanie kolumn</title>
  180. <para>
  181. Drugi argument metody <methodname>from()</methodname> może zawierać kolumny, które
  182. mają zostać pobrane z odpowiedniej tabeli. Jeśli nie poda się tego argumentu domyślną
  183. wartością jest "<code>*</code>" czyli znak specjalny <acronym>SQL</acronym> odpowiadający
  184. wszystkim kolumnom.
  185. </para>
  186. <para>
  187. Kolumny można podawać w prostej tablicy łańcuchów tekstowych lub jako asocjacyjnej
  188. tablicy aliasów kolumn do nazw kolumn. Jeśli potrzebna jest tylko jedna kolumna to
  189. można ją podać w prostym stringu - nie trzeba używać tablicy.
  190. </para>
  191. <para>
  192. Jeśli w tym argumencie zostanie podana pusta tablica to żadna kolumna z odpowiedniej
  193. tabeli nie zostanie dołączona do wyniku zapytania. Zobacz
  194. <link linkend="zend.db.select.building.join.example-no-columns">przykład kodu</link>
  195. znajdujący się pod rozdziałem dotyczącym metody <methodname>join()</methodname>.
  196. </para>
  197. <para>
  198. Nazwę kolumny można podać w formie "<code>nazwaAliasu.nazwaKolumny</code>".
  199. <classname>Zend_Db_Select</classname> umieści każdą z części nazwy oddzielnie
  200. w cudzysłowach, używając aliasu wcześniej ustalonego w metodzie
  201. <methodname>from()</methodname> (jeśli nie został podany bezpośrednio).
  202. </para>
  203. <example id="zend.db.select.building.columns.example">
  204. <title>Przykład dodawania kolumn</title>
  205. <programlisting language="php"><![CDATA[
  206. // Tworzenie zapytania:
  207. // SELECT p."product_id", p."product_name"
  208. // FROM "products" AS p
  209. $select = $db->select()
  210. ->from(array('p' => 'products'),
  211. array('product_id', 'product_name'));
  212. // Tworzenie podobnego zapytania z użyciem aliasów tabeli:
  213. // SELECT p."product_id", p."product_name"
  214. // FROM "products" AS p
  215. $select = $db->select()
  216. ->from(array('p' => 'products'),
  217. array('p.product_id', 'p.product_name'));
  218. // Tworzenie podobnego zapytania z aliasem dla jednej kolumny:
  219. // SELECT p."product_id" AS prodno, p."product_name"
  220. // FROM "products" AS p
  221. $select = $db->select()
  222. ->from(array('p' => 'products'),
  223. array('prodno' => 'product_id', 'product_name'));
  224. ]]></programlisting>
  225. </example>
  226. </sect3>
  227. <sect3 id="zend.db.select.building.columns-expr">
  228. <title>Dodawanie kolumn z wyrażeniami</title>
  229. <para>
  230. W zapytaniach <acronym>SQL</acronym> często zachodzi potrzeba użycia wyrażeń
  231. zamiast zwykłych kolumn tabeli. Wyrażenia nie powinny być otoczone cudzysłowami
  232. ani zawierać aliasów tabel. Jeśli podana kolumna zawiera nawiasy
  233. <classname>Zend_Db_Select</classname> rozpoznaje ją jako wyrażenie.
  234. </para>
  235. <para>
  236. Można również samemu utworzyć obiekt klasy <classname>Zend_Db_Expr</classname>
  237. aby łańcuch znaków nie został potraktowany jak zwykła nazwa kolumny.
  238. <classname>Zend_Db_Expr</classname> jest małą klasą zawierającą jeden string.
  239. <classname>Zend_Db_Select</classname> rozpoznaje instancje klasy
  240. <classname>Zend_Db_Expr</classname> i zamienia je na łańcuchy znaków ale nie
  241. wprowadza zmian takich jak cudzysłowy czy aliasy tabel.
  242. </para>
  243. <note>
  244. <para>
  245. Używanie <classname>Zend_Db_Expr</classname> dla wyrażeń nie jest obowiązkowe
  246. jeśli zawiera ono nawiasy. <classname>Zend_Db_Select</classname> rozpoznaje
  247. nawiasy i traktuje dany łańcuch jak wyrażenie (nie umieszcza w cudzysłowach
  248. ani nie dodanie nazw alias tabel).
  249. </para>
  250. </note>
  251. <example id="zend.db.select.building.columns-expr.example">
  252. <title>Przykłady podawania kolumn zawierających wyrażenia</title>
  253. <programlisting language="php"><![CDATA[
  254. // Tworzenie zapytania:
  255. // SELECT p."product_id", LOWER(product_name)
  256. // FROM "products" AS p
  257. // Wyrażenie z nawiasami staje się obiektem klasy Zend_Db_Expr.
  258. $select = $db->select()
  259. ->from(array('p' => 'products'),
  260. array('product_id', 'LOWER(product_name)'));
  261. // Tworzenie zapytania:
  262. // SELECT p."product_id", (p.cost * 1.08) AS cost_plus_tax
  263. // FROM "products" AS p
  264. $select = $db->select()
  265. ->from(array('p' => 'products'),
  266. array('product_id',
  267. 'cost_plus_tax' => '(p.cost * 1.08)')
  268. );
  269. // Tworzenie zapytania używając Zend_Db_Expr:
  270. // SELECT p."product_id", p.cost * 1.08 AS cost_plus_tax
  271. // FROM "products" AS p
  272. $select = $db->select()
  273. ->from(array('p' => 'products'),
  274. array('product_id',
  275. 'cost_plus_tax' =>
  276. new Zend_Db_Expr('p.cost * 1.08'))
  277. );
  278. ]]></programlisting>
  279. </example>
  280. <para>
  281. W powyższych przykładach <classname>Zend_Db_Select</classname> nie zmienia stringa
  282. i nie dodaje aliasów tabel ani nie używa cudzysłowów. Jeśli takie zmiany są niezbędne
  283. (np. z powodu dwuznaczności nazw) należy je wprowadzić ręcznie.
  284. </para>
  285. <para>
  286. Jeśli podane nazwy kolumn zawierają słowa kluczowe <acronym>SQL</acronym> lub
  287. znaki specjalne należy użyć metody adaptera połączenia o nazwie
  288. <methodname>quoteIdentifier()</methodname> i rezultat umieścić w stringu. Metoda
  289. <methodname>quoteIdentifier()</methodname> używa cudzysłowów dzięki czemu można być
  290. pewnym, że podany łańcuch znaków jest identyfikatorem tabeli lub kolumny
  291. a nie częścią składni polecenia <acronym>SQL</acronym>.
  292. </para>
  293. <para>
  294. Dzięki użyciu metody <methodname>quoteIdentifier()</methodname> zamiast ręcznego
  295. wpisywania cudzysłowów kod staje się niezależny od rodzaju bazy danych. Niektóre
  296. systemy zarządzania bazą danych (<acronym>RDBMS</acronym>) używają niestandardowych
  297. znaków do ograniczania identyfikatorów. Metoda <methodname>quoteIdentifier()</methodname>
  298. jest przystosowana do używania odpowiednich symboli ograniczających w zależności
  299. od typu używanego adaptera. Metoda <methodname>quoteIdentifier()</methodname> dokonuje
  300. również unikania znaków cudzysłowia, które pojawią się w argumencie wejściowym.
  301. </para>
  302. <example id="zend.db.select.building.columns-quoteid.example">
  303. <title>Przykłady umieszczania wyrażeń w cudzysłowach</title>
  304. <programlisting language="php"><![CDATA[
  305. // Tworzenie zapytania,
  306. // umieszczając kolumnę o nazwie "from" w cudzysłowach:
  307. // SELECT p."from" + 10 AS origin
  308. // FROM "products" AS p
  309. $select = $db->select()
  310. ->from(array('p' => 'products'),
  311. array('origin' =>
  312. '(p.' . $db->quoteIdentifier('from') . ' + 10)')
  313. );
  314. ]]></programlisting>
  315. </example>
  316. </sect3>
  317. <sect3 id="zend.db.select.building.columns-atomic">
  318. <title>Dodawanie kolumn do wcześniej utworzonej klauzuli FROM lub JOIN</title>
  319. <para>
  320. Może powstać sytuacja w której niezbędne okazuje się dodanie kolumn do klauzuli
  321. FROM lub JOIN, która została utworzona wcześniej (za pomocą odpowiedniej metody).
  322. Metoda <methodname>columns()</methodname> pozwala na dodanie kolumn w dowolnym
  323. momencie przed wykonaniem zapytania. Kolumny można podać jako łańcuchy znaków,
  324. obiekty <classname>Zend_Db_Expr</classname> lub jako tablice tych elementów. Drugi
  325. argument tej metody może zostać pominięty co oznacza, że kolumny powinny zostać
  326. dodane do tabeli z klauzuli FROM. W przeciwnym razie należy podać alias lub nazwę
  327. tabeli.
  328. </para>
  329. <example id="zend.db.select.building.columns-atomic.example">
  330. <title>Przykłady dodawania kolumn metodą columns()</title>
  331. <programlisting language="php"><![CDATA[
  332. // Tworzenie zapytania:
  333. // SELECT p."product_id", p."product_name"
  334. // FROM "products" AS p
  335. $select = $db->select()
  336. ->from(array('p' => 'products'), 'product_id')
  337. ->columns('product_name');
  338. // Tworzenie zapytania używając nazwy alias:
  339. // SELECT p."product_id", p."product_name"
  340. // FROM "products" AS p
  341. $select = $db->select()
  342. ->from(array('p' => 'products'), 'p.product_id')
  343. ->columns('product_name', 'p');
  344. // Alternatywnie można użyć columns('p.product_name')
  345. ]]></programlisting>
  346. </example>
  347. </sect3>
  348. <sect3 id="zend.db.select.building.join">
  349. <title>Dodawanie tabeli do zapytania za pomocą JOIN</title>
  350. <para>
  351. Wiele użytecznych zapytań zawiera klauzulę <acronym>JOIN</acronym> służącą do
  352. łączenia wierszy z wielu tabel. Aby dodać tabele do obiektu
  353. <classname>Zend_Db_Select</classname> należy użyć metody
  354. <methodname>join()</methodname>. Używanie jej jest podobne do użycia metody
  355. <methodname>from()</methodname> z tym, że tu można również użyć warunek łączenia
  356. tabel.
  357. </para>
  358. <example id="zend.db.select.building.join.example">
  359. <title>Przykład użycia metody join()</title>
  360. <programlisting language="php"><![CDATA[
  361. // Tworzenie zapytania:
  362. // SELECT p."product_id", p."product_name", l.*
  363. // FROM "products" AS p JOIN "line_items" AS l
  364. // ON p.product_id = l.product_id
  365. $select = $db->select()
  366. ->from(array('p' => 'products'),
  367. array('product_id', 'product_name'))
  368. ->join(array('l' => 'line_items'),
  369. 'p.product_id = l.product_id');
  370. ]]></programlisting>
  371. </example>
  372. <para>
  373. Drugi argument metody <methodname>join()</methodname> to string stanowiący warunek
  374. połączenia. Jest to wyrażenie określające kryteria wg. których wiersze z jednej tabeli
  375. łączą się z wierszami drugiej tabeli. W tym miejscu można użyć aliasów tabel.
  376. </para>
  377. <note>
  378. <para>
  379. Do warunku połączenia nie są stosowane cudzysłowy; Jeśli występuje konieczność
  380. umieszczenia nazwy kolumny w cudzysłowach, należy użyć metody adaptera
  381. <methodname>quoteIdentifier()</methodname> przy formowaniu wyrażenia warunku
  382. połączenia.
  383. </para>
  384. </note>
  385. <para>
  386. Trzeci argument metody <methodname>join()</methodname> to tablica nazw kolumn (tak
  387. jak przy metodzie <methodname>from()</methodname>). Domyślną wartością jest
  388. "<code>*</code>". Można w nim podawać aliasy kolumn, wyrażenia lub obiekty
  389. <classname>Zend_Db_Expr</classname> w taki sam sposób jak w metodzie
  390. <methodname>from()</methodname>.
  391. </para>
  392. <para>
  393. Aby nie wybierać żadnej kolumny należy podać pustą tablicę zamiast nazw kolumn.
  394. Ten sposób działa również w metodzie <methodname>from()</methodname> ale z
  395. podstawowych tabel przeważnie kolumny są potrzebne, co nie zawsze jest prawdą
  396. dla kolumn tabeli połączonej.
  397. </para>
  398. <example id="zend.db.select.building.join.example-no-columns">
  399. <title>Przykład nie podawania kolumn</title>
  400. <programlisting language="php"><![CDATA[
  401. // Tworzenie zapytania:
  402. // SELECT p."product_id", p."product_name"
  403. // FROM "products" AS p JOIN "line_items" AS l
  404. // ON p.product_id = l.product_id
  405. $select = $db->select()
  406. ->from(array('p' => 'products'),
  407. array('product_id', 'product_name'))
  408. ->join(array('l' => 'line_items'),
  409. 'p.product_id = l.product_id',
  410. array() ); // pusta lista kolumn
  411. ]]></programlisting>
  412. <para>
  413. W miejscu listy kolum tabeli połączonej występuje pusta tablica
  414. (<methodname>array()</methodname>).
  415. </para>
  416. </example>
  417. <para>
  418. <acronym>SQL</acronym> dysponuje wieloma rodzajami klauzul JOIN. Poniżej znajduje
  419. się lista metod klasy <classname>Zend_Db_Select</classname> obsługująca je.
  420. </para>
  421. <itemizedlist>
  422. <listitem>
  423. <para>
  424. <command>INNER JOIN</command> za pomocą <methodname>join(tabela, warunek, [kolumny])</methodname>
  425. lub <methodname>joinInner(tabela, warunek, [kolumny])</methodname>
  426. </para>
  427. <para>
  428. To jest najbardziej popularny rodzaj połączenia JOIN. Wiersze z każdej tabeli
  429. są porównywane za pomocą podanego warunku. Zbiór wyjściowy zawiera jedynie
  430. wiersze, które spełniają warunek połączenia. Jeśli żadna para wierszy nie
  431. spełnia warunku to zbiór pozostanie pusty.
  432. </para>
  433. <para>
  434. Wszystkie systemy zarządzania bazą danych (<acronym>RDBMS</acronym>) posiadają
  435. implementację tego rodzaju polecenia JOIN.
  436. </para>
  437. </listitem>
  438. <listitem>
  439. <para>
  440. <command>LEFT JOIN</command> za pomocą metody
  441. <methodname>joinLeft(tabela, warunek, [kolumny])</methodname>.
  442. </para>
  443. <para>
  444. Wszystkie wiersze z tabeli znajdującej się po lewej stronie "wchodzą"
  445. do wyniku. Te, które nie mają odpowiadającego wiersza w tabeli znajdującej
  446. się po stronie prawej - zostają wypełnione wartościami <constant>NULL</constant>
  447. (w kolumnach z prawej tabeli).
  448. </para>
  449. <para>
  450. Wszystkie systemy zarządzania bazą danych (<acronym>RDBMS</acronym>) posiadają
  451. implementację tego rodzaju polecenia JOIN.
  452. </para>
  453. </listitem>
  454. <listitem>
  455. <para>
  456. <command>RIGHT JOIN</command> za pomocą metody
  457. <methodname>joinRight(tabela, warunek, [kolumny])</methodname>
  458. </para>
  459. <para>
  460. RIGHT JOIN to przeciwieństwo LEFT JOIN. Wszystkie wiersze z tabeli znajdującej
  461. się po prawej stronie są umieszczone w wyniku. Te, które nie posiadają
  462. odpowiednika w tabeli lewej otrzymują wartości <constant>NULL</constant>
  463. w kolumnach z lewej tabeli.
  464. </para>
  465. <para>
  466. Niektóre systemy zarządzania bazą danych (<acronym>RDBMS</acronym>) nie
  467. wspierają tego typu polecenia JOIN ale generalnie każdy
  468. <command>RIGHT JOIN</command> może zostać zaprezentowany jako
  469. <command>LEFT JOIN</command> poprzez odwrócenie kolejności dodawania tabel.
  470. </para>
  471. </listitem>
  472. <listitem>
  473. <para>
  474. <command>FULL JOIN</command> za pomocą metody
  475. <methodname>joinFull(tabela, warunek, [kolumny])</methodname>
  476. </para>
  477. <para>
  478. To polecenie jest jak połączenie <command>LEFT JOIN</command> oraz
  479. <command>RIGHT JOIN</command>. Wszystkie wiersze z obu tabel są włączane
  480. do wyniku. Jeśli dany wiersz nie posiada odpowiednika spełniającego warunek
  481. połączenia w drugiej tabeli to w kolumnach z tej tabeli umieszczony jest
  482. <constant>NULL</constant>.
  483. </para>
  484. <para>
  485. Niektóre systemy zarządzania bazą danych (<acronym>RDBMS</acronym>) nie
  486. wspierają tego typu polecenia JOIN.
  487. </para>
  488. </listitem>
  489. <listitem>
  490. <para>
  491. <command>CROSS JOIN</command> za pomocą metody
  492. <methodname>joinCross(tabela, [kolumny])</methodname>.
  493. </para>
  494. <para>
  495. Cross join to iloczyn kartezjański tabel. Każdy wiersz z pierwszej tabeli
  496. zostaje połączony z każdym wierszem z tabeli drugiej. Ilość wierszy w zbiorze
  497. wynikowym jest równa iloczynowi ilości wierszy w obu tabelach. Poprzez użycie
  498. warunku WHERE można ograniczyć wiersze wynikowe przez co cross join może być
  499. podobny do składni polecenia join ze standardu SQL-89.
  500. </para>
  501. <para>
  502. Metoda <methodname>joinCross()</methodname> nie ma parametru odnoszącego się
  503. do warunku połączenia. Niektóre systemy zarządzania bazą danych
  504. (<acronym>RDBMS</acronym>) nie wspierają tego typu polecenia JOIN.
  505. </para>
  506. </listitem>
  507. <listitem>
  508. <para>
  509. <command>NATURAL JOIN</command> za pomocą metody
  510. <methodname>joinNatural(tabela, [kolumny])</methodname>.
  511. </para>
  512. <para>
  513. Polecenie natural join łączy wiersze pod względem wszystkich kolumn, które
  514. mają taką samą nazwę w obydwu tabelach. Warunkiem połączenia jest zgodność
  515. wartości wszystkich tak samo nazwanych kolumn tabel. Porównywanie wartości
  516. na zasadzie niezgodności (różnicy) nie stanowi polecenia natural join.
  517. Jedynie polecenia typu natural inner join są zaimplementowane w tym API
  518. pomimo tego że standard <acronym>SQL</acronym> definiuje też polecenia
  519. natural outer join.
  520. </para>
  521. <para>
  522. Metoda <methodname>joinCross()</methodname> nie ma parametru odnoszącego się
  523. do warunku połączenia.
  524. </para>
  525. </listitem>
  526. </itemizedlist>
  527. <para>
  528. Oprócz powyższych metod można uprościć zapytania używając metod JoinUsing. Zamiast
  529. podawania pełnego warunku można wybrać nazwę kolumny, na podstawie której
  530. połączenie będzie przeprowadzone a obiekt <classname>Zend_Db_Select</classname>
  531. dopisze niezbędną część polecenia warunku.
  532. </para>
  533. <example id="zend.db.select.building.joinusing.example">
  534. <title>Przykład użycia metody joinUsing()</title>
  535. <programlisting language="php"><![CDATA[
  536. // Tworzenie zapytania:
  537. // SELECT *
  538. // FROM "table1"
  539. // JOIN "table2"
  540. // ON "table1".column1 = "table2".column1
  541. // WHERE column2 = 'foo'
  542. $select = $db->select()
  543. ->from('table1')
  544. ->joinUsing('table2', 'column1')
  545. ->where('column2 = ?', 'foo');
  546. ]]></programlisting>
  547. </example>
  548. <para>
  549. Każda z metod połączenia klasy <classname>Zend_Db_Select</classname> ma
  550. odpowiednią metodę 'using'.
  551. </para>
  552. <itemizedlist>
  553. <listitem>
  554. <para>
  555. <methodname>joinUsing(tabela, [kolumny])</methodname> and
  556. <methodname>joinInnerUsing(tabela, [kolumny])</methodname>
  557. </para>
  558. </listitem>
  559. <listitem>
  560. <para>
  561. <methodname>joinLeftUsing(tabela, [kolumny])</methodname>
  562. </para>
  563. </listitem>
  564. <listitem>
  565. <para>
  566. <methodname>joinRightUsing(tabela, [kolumny])</methodname>
  567. </para>
  568. </listitem>
  569. <listitem>
  570. <para>
  571. <methodname>joinFullUsing(tabela, [kolumny])</methodname>
  572. </para>
  573. </listitem>
  574. </itemizedlist>
  575. </sect3>
  576. <sect3 id="zend.db.select.building.where">
  577. <title>Dodawanie klauzuli WHERE</title>
  578. <para>
  579. Za pomocą metody <methodname>where()</methodname> można określić kryteria
  580. ograniczające ilość wierszy zwracanych przez zapytanie. Pierwszy argument tej
  581. metody to wyrażenie <acronym>SQL</acronym> które zostanie użyte w klauzuli
  582. WHERE zapytania <acronym>SQL</acronym>.
  583. </para>
  584. <example id="zend.db.select.building.where.example">
  585. <title>Przykład użycia metody where()</title>
  586. <programlisting language="php"><![CDATA[
  587. // Tworzenie zapytania:
  588. // SELECT product_id, product_name, price
  589. // FROM "products"
  590. // WHERE price > 100.00
  591. $select = $db->select()
  592. ->from('products',
  593. array('product_id', 'product_name', 'price'))
  594. ->where('price > 100.00');
  595. ]]></programlisting>
  596. </example>
  597. <note>
  598. <para>
  599. Wyrażenia w metodach <methodname>where()</methodname> lub
  600. <methodname>orWhere()</methodname> nie zostają umieszczone w cudzysłowach.
  601. Jeśli nazwa kolumny tego wymaga należy użyć metody
  602. <methodname>quoteIdentifier()</methodname> podczas tworzenia parametru warunku.
  603. </para>
  604. </note>
  605. <para>
  606. Drugi argument metody <methodname>where()</methodname> jest opcjonalny. Stanowi on
  607. wartość umieszczaną w warunku. <classname>Zend_Db_Select</classname> ogranicza tą
  608. wartość cudzysłowami i za jej pomocą podmienia symbol znaku zapytania
  609. ("<code>?</code>") w warunku.
  610. </para>
  611. <example id="zend.db.select.building.where.example-param">
  612. <title>Przykład użycia parametru w metodzie where()</title>
  613. <programlisting language="php"><![CDATA[
  614. // Tworzenie zapytania:
  615. // SELECT product_id, product_name, price
  616. // FROM "products"
  617. // WHERE (price > 100.00)
  618. $minimumPrice = 100;
  619. $select = $db->select()
  620. ->from('products',
  621. array('product_id', 'product_name', 'price'))
  622. ->where('price > ?', $minimumPrice);
  623. ]]></programlisting>
  624. </example>
  625. <para>
  626. Drugi parametr metody <methodname>where()</methodname> przyjmuje również
  627. tablicę w przypadku gdy używa się operatora IN.
  628. </para>
  629. <example id="zend.db.select.building.where.example-array">
  630. <title>Przykład użycia tablicy w metodzie where()</title>
  631. <programlisting language="php"><![CDATA[
  632. // Tworzenie zapytania:
  633. // SELECT product_id, product_name, price
  634. // FROM "products"
  635. // WHERE (product_id IN (1, 2, 3))
  636. $productIds = array(1, 2, 3);
  637. $select = $db->select()
  638. ->from('products',
  639. array('product_id', 'product_name', 'price'))
  640. ->where('product_id IN (?)', $productIds);
  641. ]]></programlisting>
  642. </example>
  643. <para>
  644. Metoda <methodname>where()</methodname> może być wywoływana wiele razy dla jednego
  645. obiektu <classname>Zend_Db_Select</classname>. Zapytanie wynikowe łączy wszystkie
  646. warunki używając wyrażenia <acronym>AND</acronym>.
  647. </para>
  648. <example id="zend.db.select.building.where.example-and">
  649. <title>Przykład wywołania metody where() wiele razy</title>
  650. <programlisting language="php"><![CDATA[
  651. // Tworzenie zapytania:
  652. // SELECT product_id, product_name, price
  653. // FROM "products"
  654. // WHERE (price > 100.00)
  655. // AND (price < 500.00)
  656. $minimumPrice = 100;
  657. $maximumPrice = 500;
  658. $select = $db->select()
  659. ->from('products',
  660. array('product_id', 'product_name', 'price'))
  661. ->where('price > ?', $minimumPrice)
  662. ->where('price < ?', $maximumPrice);
  663. ]]></programlisting>
  664. </example>
  665. <para>
  666. Jeśli istnieje potrzeba połączenia warunków za pomocą wyrażenia <acronym>OR</acronym>
  667. należy użyć metody <methodname>orWhere()</methodname>. Można jej używać
  668. w taki sam sposób jak metody <methodname>where()</methodname>. W wynikowym
  669. poleceniu warunki zostaną połączone wyrażeniem <acronym>OR</acronym>
  670. zamiast <acronym>AND</acronym>.
  671. </para>
  672. <example id="zend.db.select.building.where.example-or">
  673. <title>Przykład użycia metody orWhere()</title>
  674. <programlisting language="php"><![CDATA[
  675. // Tworzenie zapytania:
  676. // SELECT product_id, product_name, price
  677. // FROM "products"
  678. // WHERE (price < 100.00)
  679. // OR (price > 500.00)
  680. $minimumPrice = 100;
  681. $maximumPrice = 500;
  682. $select = $db->select()
  683. ->from('products',
  684. array('product_id', 'product_name', 'price'))
  685. ->where('price < ?', $minimumPrice)
  686. ->orWhere('price > ?', $maximumPrice);
  687. ]]></programlisting>
  688. </example>
  689. <para>
  690. <classname>Zend_Db_Select</classname> automatycznie umieszcza wyrażenia podane
  691. do metod <methodname>where()</methodname> lub <methodname>orWhere()</methodname>
  692. w nawiasach. Dzięki temu kolejność wykonywania działań logicznych nie spowoduje
  693. nieoczekiwanych rezultatów.
  694. </para>
  695. <example id="zend.db.select.building.where.example-parens">
  696. <title>Przykład umieszczania wyrażeń w nawiasach</title>
  697. <programlisting language="php"><![CDATA[
  698. // Tworzenie zapytania:
  699. // SELECT product_id, product_name, price
  700. // FROM "products"
  701. // WHERE (price < 100.00 OR price > 500.00)
  702. // AND (product_name = 'Apple')
  703. $minimumPrice = 100;
  704. $maximumPrice = 500;
  705. $prod = 'Apple';
  706. $select = $db->select()
  707. ->from('products',
  708. array('product_id', 'product_name', 'price'))
  709. ->where("price < $minimumPrice OR price > $maximumPrice")
  710. ->where('product_name = ?', $prod);
  711. ]]></programlisting>
  712. </example>
  713. <para>
  714. W powyższym przykładzie zapytanie bez nawiasów przyniosłoby inny rezultat ponieważ
  715. <acronym>AND</acronym> ma wyższy priorytet niż <acronym>OR</acronym>.
  716. Dzięki nawiasom <classname>Zend_Db_Select</classname> sprawia, że każde
  717. wywołanie metody <methodname>where()</methodname> łączy zawarte w niej warunki
  718. z wyższym priorytetem niż <acronym>AND</acronym> który łączy poszczególne warunki.
  719. </para>
  720. </sect3>
  721. <sect3 id="zend.db.select.building.group">
  722. <title>Adding a GROUP BY Clause</title>
  723. <para>
  724. W <acronym>SQL</acronym>, klauzula <command>GROUP BY</command> pozwala na
  725. ograniczenie wierszy wyników zapytania do jednego wiersza na każdą unikalną wartość
  726. znalezioną w kolumnie podanej przy klauzuli <command>GROUP BY</command>.
  727. </para>
  728. <para>
  729. Aby określić kolumny używane do podzielenia wyników na grupy w
  730. <classname>Zend_Db_Select</classname> należy użyć metody <methodname>group()</methodname>.
  731. Jako argument podaje się kolumnę lub tablicę kolumn, które mają trafić
  732. do klauzuli <command>GROUP BY</command>.
  733. </para>
  734. <example id="zend.db.select.building.group.example">
  735. <title>Przykład użycia metody group()</title>
  736. <programlisting language="php"><![CDATA[
  737. // Tworzenie zapytania:
  738. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  739. // FROM "products" AS p JOIN "line_items" AS l
  740. // ON p.product_id = l.product_id
  741. // GROUP BY p.product_id
  742. $select = $db->select()
  743. ->from(array('p' => 'products'),
  744. array('product_id'))
  745. ->join(array('l' => 'line_items'),
  746. 'p.product_id = l.product_id',
  747. array('line_items_per_product' => 'COUNT(*)'))
  748. ->group('p.product_id');
  749. ]]></programlisting>
  750. </example>
  751. <para>
  752. Podobnie jak w przypadku metody <methodname>from()</methodname> w argumencie można
  753. używać aliasów tabel a nazwy są umieszczane w cudzysłowach jako identyfikatory chyba
  754. że łańcuch znaków zawiera nawiasy lub jest obiektem <classname>Zend_Db_Expr</classname>.
  755. </para>
  756. </sect3>
  757. <sect3 id="zend.db.select.building.having">
  758. <title>Dodawanie klauzuli HAVING</title>
  759. <para>
  760. W <acronym>SQL</acronym>, klauzula <constant>HAVING</constant> wprowadza ograniczenie
  761. w stosunku do grup wierszy. Jest to podobne do sposobu w jaki klauzula
  762. <constant>WHERE</constant> ogranicza wiersze ogólnie. Te klauzule są różne ponieważ
  763. warunki <constant>WHERE</constant> są oceniane prze definiowaniem grup, podczas gdy
  764. warunki <constant>HAVING</constant> nakładane są po uformowaniu grup.
  765. </para>
  766. <para>
  767. W <classname>Zend_Db_Select</classname> można określić warunki dotyczące grup wierszy
  768. za pomocą metody <methodname>having()</methodname>. Użycie jej jest podobne do metody
  769. <methodname>where()</methodname>. Pierwszy argument to string zawierający wyrażenie
  770. <acronym>SQL</acronym>. Opcjonalny drugi argument to wartość używana do zamienienia
  771. pozycyjnych parametrów w wyrażeniu <acronym>SQL</acronym>. Wyrażenia umieszczone w
  772. wielu wywołaniach metody <methodname>having()</methodname> są łączone za pomocą
  773. operatora <constant>AND</constant> lub <code>OR</code> - jeśli zostanie użyta metoda
  774. <methodname>orHaving()</methodname>.
  775. </para>
  776. <example id="zend.db.select.building.having.example">
  777. <title>Przykład użycia metody having()</title>
  778. <programlisting language="php"><![CDATA[
  779. // Tworzenie zapytania:
  780. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  781. // FROM "products" AS p JOIN "line_items" AS l
  782. // ON p.product_id = l.product_id
  783. // GROUP BY p.product_id
  784. // HAVING line_items_per_product > 10
  785. $select = $db->select()
  786. ->from(array('p' => 'products'),
  787. array('product_id'))
  788. ->join(array('l' => 'line_items'),
  789. 'p.product_id = l.product_id',
  790. array('line_items_per_product' => 'COUNT(*)'))
  791. ->group('p.product_id')
  792. ->having('line_items_per_product > 10');
  793. ]]></programlisting>
  794. </example>
  795. <note>
  796. <para>
  797. W metodach <methodname>having()</methodname> oraz
  798. <methodname>orHaving()</methodname> nie jest stosowane umieszczanie
  799. identyfikatorów w cudzysłowach. Jeśli nazwa kolumny tego wymaga należy użyć
  800. metody <methodname>quoteIdentifier()</methodname> podczas tworzenia parametru
  801. warunku.
  802. </para>
  803. </note>
  804. </sect3>
  805. <sect3 id="zend.db.select.building.order">
  806. <title>Dodawanie klauzuli ORDER BY</title>
  807. <para>
  808. W <acronym>SQL</acronym>, klauzula <code>ORDER BY</code> określa jedną bądź więcej
  809. kolumn lub wyrażeń według których zbiór wynikowy jest posortowany. Jeśli poda się
  810. wiele kolumn to sortowanie odbywa się w pierwszej kolejności na podstawie wcześniej
  811. podanej kolumny. Jeśli istnieją wiersze o takiej samej wartośći w danej kolumnie
  812. to do sortowania używana jest kolejna klumna klauzuli <code>ORDER BY</code>. Domyślny
  813. kierunek sortowania to od najmniejszej wartości do największej. Można sortować w
  814. przeciwnym kierunku przez użycie słowa kluczowego <constant>DESC</constant> po
  815. nazwie kolumny sortowania.
  816. </para>
  817. <para>
  818. W <classname>Zend_Db_Select</classname> można użyć metody <methodname>order()</methodname>
  819. i podać kolumnę lub tablicę kolumn według których sortowanie ma przebiegać. Każdy z
  820. elementów tablicy powinien być łańcuchem znaków określającym kolumnę. Opcjonalnie
  821. można dodać słowa kluczowe <constant>ASC</constant> lub <constant>DESC</constant>
  822. oddzielone od kolumny spacją.
  823. </para>
  824. <para>
  825. Podobnie jak przy metodach <methodname>from()</methodname> oraz
  826. <methodname>group()</methodname> nazwy kolumn są otaczane cudzysłowami, chyba że
  827. zawierają nawiasy lub są obiektami klasy <classname>Zend_Db_Expr</classname>.
  828. </para>
  829. <example id="zend.db.select.building.order.example">
  830. <title>Przykład użycia metody order()</title>
  831. <programlisting language="php"><![CDATA[
  832. // Tworzenie zapytania:
  833. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  834. // FROM "products" AS p JOIN "line_items" AS l
  835. // ON p.product_id = l.product_id
  836. // GROUP BY p.product_id
  837. // ORDER BY "line_items_per_product" DESC, "product_id"
  838. $select = $db->select()
  839. ->from(array('p' => 'products'),
  840. array('product_id'))
  841. ->join(array('l' => 'line_items'),
  842. 'p.product_id = l.product_id',
  843. array('line_items_per_product' => 'COUNT(*)'))
  844. ->group('p.product_id')
  845. ->order(array('line_items_per_product DESC',
  846. 'product_id'));
  847. ]]></programlisting>
  848. </example>
  849. </sect3>
  850. <sect3 id="zend.db.select.building.limit">
  851. <title>Dodawanie klauzuli LIMIT</title>
  852. <para>
  853. Niektóre systemy zarządzania bazą danych (<acronym>RDBMS</acronym>) rozszerzają
  854. <acronym>SQL</acronym> za pomocą klauzuli <constant>LIMIT</constant>. Za jej
  855. pomocą można ograniczyć ilość wierszy zwracanych w zapytaniu do podanej ilości.
  856. Można również określić ilość wierszy, która ma zostać opuszczona przed rozpoczęciem
  857. zwracania wyników zapytania. Dzięki temu można w łatwy sposób uzyskać podzbiór
  858. ze zbioru wynikowego. Może to być przydatne np. przy wyświetlaniu rezultatów zapytania
  859. z podziałem na strony.
  860. </para>
  861. <para>
  862. W <classname>Zend_Db_Select</classname> można użyć metody
  863. <methodname>limit()</methodname> aby określić ilość wierszy do zwrócenia oraz do
  864. opuszczenia. <emphasis>Pierswszy</emphasis> argumement metody to ilość wierszy
  865. jaka maksymalnie ma zostać zwrócona. <emphasis>Drugi</emphasis> argument to ilość
  866. wierszy do opuszczenia.
  867. </para>
  868. <example id="zend.db.select.building.limit.example">
  869. <title>Przykład użycia metody limit()</title>
  870. <programlisting language="php"><![CDATA[
  871. // Tworzenie zapytania:
  872. // SELECT p."product_id", p."product_name"
  873. // FROM "products" AS p
  874. // LIMIT 10, 20
  875. // Equivalent to:
  876. // SELECT p."product_id", p."product_name"
  877. // FROM "products" AS p
  878. // LIMIT 20 OFFSET 10
  879. $select = $db->select()
  880. ->from(array('p' => 'products'),
  881. array('product_id', 'product_name'))
  882. ->limit(20, 10);
  883. ]]></programlisting>
  884. </example>
  885. <note>
  886. <para>
  887. Polecenie <constant>LIMIT</constant> nie jest wspierane przez wszystkie rodzaje
  888. baz danych. Niektóre z nich wymagają innej składni dla uzyskania podobnego efektu.
  889. Każda z klas <classname>Zend_Db_Adapter_Abstract</classname> zawiera metodę
  890. tworzącą polecenie <acronym>SQL</acronym> odpowiednie dla danego
  891. <acronym>RDBMS</acronym>.
  892. </para>
  893. </note>
  894. <para>
  895. Można użyć metody <methodname>limitPage()</methodname> jako alternatywy do określania
  896. ilości wierszy do zwrotu i do pominięcia. Ta metoda pozwala na podzielenie zbioru
  897. wynikowego na wiele podzbiorów o stałej wielkości i zwrócenie jednego z nich.
  898. Innymi słowy należy określić długość jednej "strony" z wynikami zapytania oraz liczbę
  899. porządkową określającą stronę, która ma zostać zwrócona. Numer strony stanowi pierwszy
  900. argument metody <methodname>limitPage()</methodname> a długość strony to drugi argument.
  901. Obydwa argumenty są wymagane - nie mają wartości domyślnych.
  902. </para>
  903. <example id="zend.db.select.building.limit.example2">
  904. <title>Przykład użycia metody limitPage()</title>
  905. <programlisting language="php"><![CDATA[
  906. // Tworzenie zapytania:
  907. // SELECT p."product_id", p."product_name"
  908. // FROM "products" AS p
  909. // LIMIT 10, 20
  910. $select = $db->select()
  911. ->from(array('p' => 'products'),
  912. array('product_id', 'product_name'))
  913. ->limitPage(2, 10);
  914. ]]></programlisting>
  915. </example>
  916. </sect3>
  917. <sect3 id="zend.db.select.building.distinct">
  918. <title>Dodawanie słowa kluczowego DISTINCT do zapytania</title>
  919. <para>
  920. Metoda <methodname>distinct()</methodname> pozwala na dodanie słowa
  921. kluczowego <constant>DISTINCT</constant> do zapytania <acronym>SQL</acronym>.
  922. </para>
  923. <example id="zend.db.select.building.distinct.example">
  924. <title>Przykład użycia metody distinct()</title>
  925. <programlisting language="php"><![CDATA[
  926. // Tworzenie zapytania:
  927. // SELECT DISTINCT p."product_name"
  928. // FROM "products" AS p
  929. $select = $db->select()
  930. ->distinct()
  931. ->from(array('p' => 'products'), 'product_name');
  932. ]]></programlisting>
  933. </example>
  934. </sect3>
  935. <sect3 id="zend.db.select.building.for-update">
  936. <title>Dodawanie słowa kluczowego FOR UPDATE do zapytania</title>
  937. <para>
  938. Metoda <methodname>forUpdate()</methodname> pozwala na dodanie słowa
  939. kluczowego <code>FOR UPDATE</code> do zapytania <acronym>SQL</acronym>.
  940. </para>
  941. <example id="zend.db.select.building.for-update.example">
  942. <title>Przykład użycia metody forUpdate()</title>
  943. <programlisting language="php"><![CDATA[
  944. // Tworzenie zapytania:
  945. // SELECT FOR UPDATE p.*
  946. // FROM "products" AS p
  947. $select = $db->select()
  948. ->forUpdate()
  949. ->from(array('p' => 'products'));
  950. ]]></programlisting>
  951. </example>
  952. </sect3>
  953. <sect3 id="zend.db.select.building.union">
  954. <title>Tworzenie zapytania z UNION</title>
  955. <para>
  956. Z <classname>Zend_Db_Select</classname> można łączyć zapytania poprzez przekazanie tablicy
  957. obiektów <classname>Zend_Db_Select</classname> lub łańcuchów zapytań do metody
  958. <methodname>union()</methodname>. Jako drugi parametr można podać stałe
  959. <constant>Zend_Db_Select::SQL_UNION</constant> lub <constant>Zend_Db_Select::SQL_UNION_ALL</constant>
  960. aby określić rodzaj połączenia jaki chce się uzyskać.
  961. </para>
  962. <example id="zend.db.select.building.union.example">
  963. <title>Przykład użycia metody union()</title>
  964. <programlisting language="php"><![CDATA[
  965. $sql1 = $db->select();
  966. $sql2 = "SELECT ...";
  967. $select = $db->select()
  968. ->union(array($sql1, $sql2))
  969. ->order("id");
  970. ]]></programlisting>
  971. </example>
  972. </sect3>
  973. </sect2>
  974. <sect2 id="zend.db.select.execute">
  975. <title>Wykonywanie zapytań Select</title>
  976. <para>
  977. Poniższa część opisuje jak wywołać zapytanie zawarte w obiekcie
  978. <classname>Zend_Db_Select</classname>.
  979. </para>
  980. <sect3 id="zend.db.select.execute.query-adapter">
  981. <title>Wykonywanie zapytań Select z poziomu adaptera bazy danych</title>
  982. <para>
  983. Zapytanie zawarte w obiekcie <classname>Zend_Db_Select</classname> można wywołać
  984. poprzez podanie obiektu jako pierwszego argumentu metody <methodname>query()</methodname>
  985. obiektu <classname>Zend_Db_Adapter_Abstract</classname>. Zalecane jest używanie
  986. obiektów <classname>Zend_Db_Select</classname> zamiast łańcuchów znaków z zapytaniem.
  987. </para>
  988. <para>
  989. Metoda <methodname>query()</methodname> w zależności od typu adaptera bazy danych
  990. zwraca obiekt klasy <classname>Zend_Db_Statement</classname> lub PDOStatement.
  991. </para>
  992. <example id="zend.db.select.execute.query-adapter.example">
  993. <title>Przykład użycia metody query() adaptera bazy danych</title>
  994. <programlisting language="php"><![CDATA[
  995. $select = $db->select()
  996. ->from('products');
  997. $stmt = $db->query($select);
  998. $result = $stmt->fetchAll();
  999. ]]></programlisting>
  1000. </example>
  1001. </sect3>
  1002. <sect3 id="zend.db.select.execute.query-select">
  1003. <title>Wykonywanie zapytań Select z samego obiektu</title>
  1004. <para>
  1005. Jako alternatywny sposób w stosunku do użycia metody <methodname>query()</methodname>
  1006. adaptera bazy danych, można użyć metody o takiej samej nazwie obiektu
  1007. <classname>Zend_Db_Select</classname>. Obydwie metody zwracają obiekt klasy
  1008. <classname>Zend_Db_Statement</classname> lub PDOStatement w zależności od typu
  1009. użytego adaptera.
  1010. </para>
  1011. <example id="zend.db.select.execute.query-select.example">
  1012. <title>Przykład użycia metody obiektu Zend_Db_Select</title>
  1013. <programlisting language="php"><![CDATA[
  1014. $select = $db->select()
  1015. ->from('products');
  1016. $stmt = $select->query();
  1017. $result = $stmt->fetchAll();
  1018. ]]></programlisting>
  1019. </example>
  1020. </sect3>
  1021. <sect3 id="zend.db.select.execute.tostring">
  1022. <title>Zamiana obiektu Select w łańcuch polecenia SQL</title>
  1023. <para>
  1024. Jeśli niezbędny jest dostęp do polecenia <acronym>SQL</acronym> w postaci łańcucha
  1025. znaków zawartego w obiekcie <classname>Zend_Db_Select</classname>, należy użyć
  1026. metody <methodname>__toString()</methodname>.
  1027. </para>
  1028. <example id="zend.db.select.execute.tostring.example">
  1029. <title>Przykład użycia metody __toString()</title>
  1030. <programlisting language="php"><![CDATA[
  1031. $select = $db->select()
  1032. ->from('products');
  1033. $sql = $select->__toString();
  1034. echo "$sql\n";
  1035. // Wyjściowy string:
  1036. // SELECT * FROM "products"
  1037. ]]></programlisting>
  1038. </example>
  1039. </sect3>
  1040. </sect2>
  1041. <sect2 id="zend.db.select.other">
  1042. <title>Inne metody</title>
  1043. <para>
  1044. Ta część opisuje inne metody klasy <classname>Zend_Db_Select</classname>, które nie
  1045. zostały wymienione wcześniej: <methodname>getPart()</methodname> oraz
  1046. <methodname>reset()</methodname>.
  1047. </para>
  1048. <sect3 id="zend.db.select.other.get-part">
  1049. <title>Uzyskanie części obiektu Select</title>
  1050. <para>
  1051. Metoda <methodname>getPart()</methodname> zwraca postać łąńcucha znaków odpowiadającą
  1052. jednej części polecenia <acronym>SQL</acronym>. Można użyć tej metody aby uzyskać
  1053. tablicę warunków klauzuli <constant>WHERE</constant>, tablicę kolumn (lub wyrażeń)
  1054. zawartych w liście <constant>SELECT</constant> albo wartości ilości wierszy
  1055. klauzuli <constant>LIMIT</constant>.
  1056. </para>
  1057. <para>
  1058. Wartością zwracaną nie jest string zawierający składnię <acronym>SQL</acronym>.
  1059. Zamiast tego zwracana jest wewnętrzna postać danych, co przeważnie oznacza tablicę
  1060. zawierającą wartości i wyrażenia. Każda część zapytania ma inną strukturę.
  1061. </para>
  1062. <para>
  1063. Jedynym argumentem metody <methodname>getPart()</methodname> jest łańcuch znaków
  1064. identyfikujący żądaną część zapytania. String <code>'from'</code> odpowiada części
  1065. obiektu <classname>Zend_Db_Select</classname>, która przechowuje informacje o tabelach
  1066. (włączając w to tabele połączone) w klauzuli <constant>FROM</constant>.
  1067. </para>
  1068. <para>
  1069. Klasa <classname>Zend_Db_Select</classname> definiuje stałe, których można użyć
  1070. jako oznaczeń zapytania <acronym>SQL</acronym>. Dozwolone jest stosowanie tych
  1071. stałych bądź nazw dosłownych.
  1072. </para>
  1073. <table id="zend.db.select.other.get-part.table">
  1074. <title>Stałe używane przez metody getPart() oraz reset()</title>
  1075. <tgroup cols="2">
  1076. <thead>
  1077. <row>
  1078. <entry>Stała</entry>
  1079. <entry>Wartość dosłowna</entry>
  1080. </row>
  1081. </thead>
  1082. <tbody>
  1083. <row>
  1084. <entry><constant>Zend_Db_Select::DISTINCT</constant></entry>
  1085. <entry><code>'distinct'</code></entry>
  1086. </row>
  1087. <row>
  1088. <entry><constant>Zend_Db_Select::FOR_UPDATE</constant></entry>
  1089. <entry><code>'forupdate'</code></entry>
  1090. </row>
  1091. <row>
  1092. <entry><constant>Zend_Db_Select::COLUMNS</constant></entry>
  1093. <entry><code>'columns'</code></entry>
  1094. </row>
  1095. <row>
  1096. <entry><constant>Zend_Db_Select::FROM</constant></entry>
  1097. <entry><code>'from'</code></entry>
  1098. </row>
  1099. <row>
  1100. <entry><constant>Zend_Db_Select::WHERE</constant></entry>
  1101. <entry><code>'where'</code></entry>
  1102. </row>
  1103. <row>
  1104. <entry><constant>Zend_Db_Select::GROUP</constant></entry>
  1105. <entry><code>'group'</code></entry>
  1106. </row>
  1107. <row>
  1108. <entry><constant>Zend_Db_Select::HAVING</constant></entry>
  1109. <entry><code>'having'</code></entry>
  1110. </row>
  1111. <row>
  1112. <entry><constant>Zend_Db_Select::ORDER</constant></entry>
  1113. <entry><code>'order'</code></entry>
  1114. </row>
  1115. <row>
  1116. <entry><constant>Zend_Db_Select::LIMIT_COUNT</constant></entry>
  1117. <entry><code>'limitcount'</code></entry>
  1118. </row>
  1119. <row>
  1120. <entry><constant>Zend_Db_Select::LIMIT_OFFSET</constant></entry>
  1121. <entry><code>'limitoffset'</code></entry>
  1122. </row>
  1123. </tbody>
  1124. </tgroup>
  1125. </table>
  1126. <example id="zend.db.select.other.get-part.example">
  1127. <title>Przykład użycia metody getPart()</title>
  1128. <programlisting language="php"><![CDATA[
  1129. $select = $db->select()
  1130. ->from('products')
  1131. ->order('product_id');
  1132. // Można użyć dosłownej nazwy żądanej części
  1133. $orderData = $select->getPart( 'order' );
  1134. // Alternatywnie można posłużyć się stałą
  1135. $orderData = $select->getPart( Zend_Db_Select::ORDER );
  1136. // Wartość zwrotna może nie być stringiem a tablicą.
  1137. // Każda część zapytania może mieć inną strukturę.
  1138. print_r( $orderData );
  1139. ]]></programlisting>
  1140. </example>
  1141. </sect3>
  1142. <sect3 id="zend.db.select.other.reset">
  1143. <title>Czyszczenie części obiektu Select</title>
  1144. <para>
  1145. Metoda <methodname>reset()</methodname> umożliwia wyczyszczenie podanej części
  1146. lub całości (jeśli nie poda się argumentu) zapytania <acronym>SQL</acronym>.
  1147. </para>
  1148. <para>
  1149. Jedyny argument jest opcjonalny. Można podać w nim część zapytania przeznaczoną
  1150. do wyczyszczenia używając tych samych łąńcuchów co w przypadku metody
  1151. <methodname>getPart()</methodname>. Podana część zapytania jest ustawiana w stan
  1152. domyślny.
  1153. </para>
  1154. <para>
  1155. Jeśli nie poda się parametru, metoda <methodname>reset()</methodname> ustawia wszystkie
  1156. części zapytania w ich stan domyślny. Przez to używany obiekt
  1157. <classname>Zend_Db_Select</classname> odpowiada nowemu obiektowi, tak jakby
  1158. został on dopiero utworzony.
  1159. </para>
  1160. <example id="zend.db.select.other.reset.example">
  1161. <title>Przykład użycia metody reset()</title>
  1162. <programlisting language="php"><![CDATA[
  1163. // Tworzenie zapytania:
  1164. // SELECT p.*
  1165. // FROM "products" AS p
  1166. // ORDER BY "product_name"
  1167. $select = $db->select()
  1168. ->from(array('p' => 'products')
  1169. ->order('product_name');
  1170. // Zmienione wymagania, sortowanie wg. innej kolumny:
  1171. // SELECT p.*
  1172. // FROM "products" AS p
  1173. // ORDER BY "product_id"
  1174. // Wyczyszczenie jednej części aby można było ją ponownie zdefiniować
  1175. $select->reset( Zend_Db_Select::ORDER );
  1176. // Podanie nowej kolumny sortowania
  1177. $select->order('product_id');
  1178. // Wyczyszczenie wszystkich części zapytania
  1179. $select->reset();
  1180. ]]></programlisting>
  1181. </example>
  1182. </sect3>
  1183. </sect2>
  1184. </sect1>
  1185. <!--
  1186. vim:se ts=4 sw=4 et:
  1187. -->