Zend_Db_Select.xml 62 KB

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