Zend_Db_Select.xml 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552
  1. <sect1 id="zend.db.select">
  2. <title>Zend_Db_Select</title>
  3. <sect2 id="zend.db.select.introduction">
  4. <title>Обзор</title>
  5. <para>
  6. Объект Zend_Db_Select представляет SQL-оператор <code>SELECT</code>.
  7. Класс имеет методы для добавления отдельных частей запроса. Вы
  8. можете определять некоторые части запроса, используя методы PHP и
  9. структуры данных, и класс формирует корректный синтаксис SQL.
  10. После того, как построен запрос, можно выполнять его так же, как
  11. если бы он был написан в виде строки.
  12. </para>
  13. <para>
  14. В число достоинств Zend_Db_Select входит:
  15. </para>
  16. <itemizedlist>
  17. <listitem>
  18. <para>
  19. Объектно-ориентированные методы для "покусочного" построения
  20. SQL-запросов;
  21. </para>
  22. </listitem>
  23. <listitem>
  24. <para>
  25. Не зависящая от типа БД абстракция некоторых частей
  26. SQL-запроса;
  27. </para>
  28. </listitem>
  29. <listitem>
  30. <para>
  31. Автоматическое в большинстве случаев заключение в кавычки
  32. идентификаторов метаданных для поддержки
  33. идентификаторов, содержащих зарезервированные SQL слова и
  34. спецсимволы;
  35. </para>
  36. </listitem>
  37. <listitem>
  38. <para>
  39. Заключение в кавычки идентификаторов и значений для снижения
  40. угрозы атак с использованием SQL-инъекций.
  41. </para>
  42. </listitem>
  43. </itemizedlist>
  44. <para>
  45. Использование Zend_Db_Select не обязательно. Для очень простых
  46. запросов SELECT обычно проще указать SQL-запрос целиком в виде
  47. строки и выполнить его, используя такие методы адаптера, как
  48. <code>query()</code> или <code>fetchAll()</code>. Использование
  49. Zend_Db_Select полезно, если нужно собрать запрос SELECT в процессе
  50. или основываясь на условной логике.
  51. </para>
  52. </sect2>
  53. <sect2 id="zend.db.select.creating">
  54. <title>Создание объекта Select</title>
  55. <para>
  56. Вы можете создавать экземпляр объекта Zend_Db_Select, используя
  57. метод <code>select()</code> объекта Zend_Db_Adapter_Abstract.
  58. </para>
  59. <example id="zend.db.select.creating.example-db">
  60. <title>Пример использования метода select() адаптера БД</title>
  61. <programlisting language="php"><![CDATA[
  62. $db = Zend_Db::factory( ...опции... );
  63. $select = $db->select();
  64. ]]>
  65. </programlisting>
  66. </example>
  67. <para>
  68. Другой способ состоит в создании объекта Zend_Db_Select через
  69. конструктор, при этом в качестве аргумента указывается адаптер БД.
  70. </para>
  71. <example id="zend.db.select.creating.example-new">
  72. <title>Пример создания нового объекта Select</title>
  73. <programlisting language="php"><![CDATA[
  74. $db = Zend_Db::factory( ...опции... );
  75. $select = new Zend_Db_Select($db);
  76. ]]>
  77. </programlisting>
  78. </example>
  79. </sect2>
  80. <sect2 id="zend.db.select.building">
  81. <title>Построение запросов Select</title>
  82. <para>
  83. При построении запроса вы можете добавлять по одному его
  84. предложения. Предложение - это часть SQL-оператора, не
  85. представляющая собой законченный оператор; например, предложение
  86. WHERE. Для каждого предложения есть свой метод Zend_Db_Select.
  87. </para>
  88. <example id="zend.db.select.building.example">
  89. <title>Пример использования методов для добавления предложений</title>
  90. <programlisting language="php"><![CDATA[
  91. // Создание объекта Zend_Db_Select
  92. $select = $db->select();
  93. // Добавление предложения FROM
  94. $select->from( ...определение таблицы и столбцов... )
  95. // Добавление предложения WHERE
  96. $select->where( ...определение критериев поиска... )
  97. // Добавление предложения ORDER BY
  98. $select->order( ...определение критериев сортировки... );
  99. ]]>
  100. </programlisting>
  101. </example>
  102. <para>
  103. Вы также можете использовать большинство методов объекта
  104. Zend_Db_Select в так называемом fluent interface.
  105. Fluent interface означает, что каждый метод возвращает ссылку на
  106. тот объект, в котором он был вызван, поэтому вы можете вызывать
  107. другой метод непосредственно за ним.
  108. </para>
  109. <example id="zend.db.select.building.example-fluent">
  110. <title>Пример использования fluent interface</title>
  111. <programlisting language="php"><![CDATA[
  112. $select = $db->select()
  113. ->from( ...определение таблицы и столбцов... )
  114. ->where( ...определение критериев поиска... )
  115. ->order( ...определение критериев сортировки... );
  116. ]]>
  117. </programlisting>
  118. </example>
  119. <para>
  120. Этот пример демонстрирует применение fluent interface, но в любом
  121. случае вы можете использовать стандартный подход. Часто
  122. бывает необходимо использовать стандартный подход - например, когда
  123. нужно выполнить некоторую логику до добавления предложения в запрос.
  124. </para>
  125. <sect3 id="zend.db.select.building.from">
  126. <title>Добавление предложения FROM</title>
  127. <para>
  128. Указывайте таблицу для запроса, используя метод
  129. <code>from()</code>. Вы можете задавать имя таблицы в виде
  130. простой строки, Zend_Db_Select добавит идентификатор, заключив в
  131. кавычки имя таблицы, поэтому вы можете использовать специальные
  132. символы.
  133. </para>
  134. <example id="zend.db.select.building.from.example">
  135. <title>Пример использования метода from()</title>
  136. <programlisting language="php">
  137. <![CDATA[
  138. // Строит запрос:
  139. // SELECT *
  140. // FROM "products"
  141. $select = $db->select()
  142. ->from( 'products' );
  143. ]]>
  144. </programlisting>
  145. </example>
  146. <para>
  147. Вы можете также задавать корреляционное (называемое также
  148. "псевдонимом") имя таблицы. В этом случае вместо простой строки
  149. используйте ассоциативный массив корреляционных имен и
  150. действительных имен таблиц. В других предложениях SQL-запроса
  151. используйте это корреляционное имя. Если в вашем запросе
  152. объединяется более одной таблицы, то Zend_Db_Select генерирует
  153. уникальные корреляционные имена, основанные на именах таблиц,
  154. для всех таблиц, для которых не были заданы корреляционные
  155. имена.
  156. </para>
  157. <example id="zend.db.select.building.from.example-cname">
  158. <title>Пример задания корреляционного имени таблицы</title>
  159. <programlisting language="php">
  160. <![CDATA[
  161. // Строит запрос:
  162. // SELECT p.*
  163. // FROM "products" AS p
  164. $select = $db->select()
  165. ->from( array('p' => 'products') );
  166. ]]>
  167. </programlisting>
  168. </example>
  169. <para>
  170. Некоторые СУРБД поддерживают спецификатор схемы для таблицы. Вы
  171. можете задавать имя таблицы в виде
  172. "<code>имяСхемы.имяТаблицы</code>". Zend_Db_Select заключит в
  173. кавычки все части по отдельности.
  174. </para>
  175. <example id="zend.db.select.building.from.example-schema">
  176. <title>Пример задания имени схемы</title>
  177. <programlisting language="php"><![CDATA[
  178. // Строит запрос:
  179. // SELECT *
  180. // FROM "myschema"."products"
  181. $select = $db->select()
  182. ->from( 'myschema.products' );
  183. // или
  184. $select = $db->select()
  185. ->from('products', '*', 'myschema');
  186. ]]>
  187. </programlisting>
  188. </example>
  189. </sect3>
  190. <sect3 id="zend.db.select.building.columns">
  191. <title>Добавление колонок</title>
  192. <para>
  193. Во втором аргументе метода <code>from()</code> вы можете
  194. задавать столбцы для выборки из соответствующей таблицы. Если вы
  195. не укажете столбцы для выборки, то по умолчанию будет подставлен
  196. метасимвол "<code>*</code>", означающий "все столбцы".
  197. </para>
  198. <para>
  199. Вы можете перечислить столбцы в простом массиве строк или
  200. в ассоциативном массиве псевдонимов столбцов и их имен. Если в
  201. запросе нужен только один столбец, и к нему не нужен псевдоним,
  202. то можно передать строку с его именем вместо массива.
  203. </para>
  204. <para>
  205. Если вы передали пустой массив в качестве аргумента для
  206. столбцов, то ни один столбец из соответствующей таблицы не будет
  207. включен в результат выборки. См.
  208. <link linkend="zend.db.select.building.join.example-no-columns">пример
  209. кода</link> в разделе про метод <code>join()</code>.
  210. </para>
  211. <para>
  212. Вы можете указать имя столбца как
  213. "<code>корреляционноеИмя.имяСтолбца</code>". Zend_Db_Select
  214. заключит в кавычки все части по отдельности. Если вы не укажете
  215. корреляционное имя для столбца, то используется корреляционное
  216. имя таблицы, указанной в текущем вызове метода
  217. <code>from()</code>.
  218. </para>
  219. <example id="zend.db.select.building.columns.example">
  220. <title>Пример указания столбцов</title>
  221. <programlisting language="php"><![CDATA[
  222. // Строит запрос:
  223. // SELECT p."product_id", p."product_name"
  224. // FROM "products" AS p
  225. $select = $db->select()
  226. ->from(array('p' => 'products'),
  227. array('product_id', 'product_name'));
  228. // Строит тот же запрос с указанием корреляционных имен:
  229. // SELECT p."product_id", p."product_name"
  230. // FROM "products" AS p
  231. $select = $db->select()
  232. ->from(array('p' => 'products'),
  233. array('p.product_id', 'p.product_name'));
  234. // Строит тот же запрос с псевдонимом для одного столбца:
  235. // SELECT p."product_id" AS prodno, p."product_name"
  236. // FROM "products" AS p
  237. $select = $db->select()
  238. ->from(array('p' => 'products'),
  239. array('prodno' => 'product_id', 'product_name'));
  240. ]]>
  241. </programlisting>
  242. </example>
  243. </sect3>
  244. <sect3 id="zend.db.select.building.columns-expr">
  245. <title>Добавление столбцов выражений</title>
  246. <para>
  247. Столбцы в SQL-запросах иногда представляют собой выражения, а не
  248. просто столбцы из таблицы. Выражения не должны иметь
  249. корреляционные имена и заключаться в кавычки. Если строка,
  250. обозначающая столбец запроса, содержит скобки, то Zend_Db_Select
  251. распознает ее как выражение.
  252. </para>
  253. <para>
  254. Вы можете также явно создавать объект типа Zend_Db_Expr для
  255. того, чтобы предотвратить ошибочное распознавание строки как
  256. имени столбца. Zend_Db_Expr - мини-класс, содержащий
  257. только строку. Zend_Db_Select распознает объекты типа
  258. Zend_Db_Expr и преобразует их обратно в строку, но без таких
  259. действий, как заключение в кавычки и добавление корелляционных
  260. имен.
  261. </para>
  262. <note>
  263. <para>
  264. Использование Zend_Db_Expr не обязательно, если ваше
  265. выражение содержит скобки. Zend_Db_Select распознает
  266. выражение по скобкам и оперирует строкой как выражением,
  267. пропуская такие действия, как заключение в кавычки и
  268. добавление корреляционных имен.
  269. </para>
  270. </note>
  271. <example id="zend.db.select.building.columns-expr.example">
  272. <title>Пример указания столбцов, содержащих выражения</title>
  273. <programlisting language="php"><![CDATA[
  274. // Строит запрос:
  275. // SELECT p."product_id", LOWER(product_name)
  276. // FROM "products" AS p
  277. // Выражение со скобками неявно преобразуется в Zend_Db_Expr.
  278. $select = $db->select()
  279. ->from(array('p' => 'products'),
  280. array('product_id', 'LOWER(product_name)'));
  281. // Строит запрос:
  282. // SELECT p."product_id", (p.cost * 1.08) AS cost_plus_tax
  283. // FROM "products" AS p
  284. $select = $db->select()
  285. ->from(array('p' => 'products'),
  286. array('product_id',
  287. 'cost_plus_tax' => '(p.cost * 1.08)')
  288. );
  289. // Построение того же запроса с явным использованием Zend_Db_Expr:
  290. // SELECT p."product_id", p.cost * 1.08 AS cost_plus_tax
  291. // FROM "products" AS p
  292. $select = $db->select()
  293. ->from(array('p' => 'products'),
  294. array('product_id',
  295. 'cost_plus_tax' =>
  296. new Zend_Db_Expr('p.cost * 1.08'))
  297. );
  298. ]]>
  299. </programlisting>
  300. </example>
  301. <para>
  302. В примерах выше Zend_Db_Select не модифицирует строку для
  303. добавления корреляционных имен или заключения идентификаторов в
  304. кавычки. Если эти изменения необходимы для исключения
  305. неоднозначности, то вы должны произвести их в строке вручную.
  306. </para>
  307. <para>
  308. Если имена столбцов являются ключевыми словами SQL или содержат
  309. специальные символы, то следует использовать метод адаптера
  310. <code>quoteIdentifier()</code> и включать результат в строку.
  311. Метод <code>quoteIdentifier()</code> использует заключение в
  312. кавычки для ограничения идентификатора, тем самым обозначается,
  313. что это идентификатор таблицы или столбца, а не другая часть
  314. синтаксиса SQL.
  315. </para>
  316. <para>
  317. Ваш код будет более независимым от типа БД, если вы будете
  318. использовать метод <code>quoteIdentifier()</code> вместо
  319. непосредственного добавления кавычек в строке, поскольку
  320. некоторые БД используют нестандартные символы вместо кавычек.
  321. Метод <code>quoteIdentifier()</code>
  322. использует нужные символы, основываясь на типе
  323. адаптера. <code>quoteIdentifier()</code> также экранирует
  324. символы кавычек в самом идентификаторе.
  325. </para>
  326. <example id="zend.db.select.building.columns-quoteid.example">
  327. <title>Пример заключения в кавычки столбцов в выражении</title>
  328. <programlisting language="php"><![CDATA[
  329. // Строится следующий запрос, при этом имя столбца "from" в выражении
  330. // заключается в кавычки:
  331. // SELECT p."from" + 10 AS origin
  332. // FROM "products" AS p
  333. $select = $db->select()
  334. ->from(array('p' => 'products'),
  335. array('origin' =>
  336. '(p.' . $db->quoteIdentifier('from') . ' + 10)')
  337. );
  338. ]]>
  339. </programlisting>
  340. </example>
  341. </sect3>
  342. <sect3 id="zend.db.select.building.columns-atomic">
  343. <title>Добавление столбцов в существующую таблицу FROM или JOIN</title>
  344. <para>
  345. Может потребоваться добавить столбцы в таблицу FROM или JOIN
  346. после того, как были вызваны соответствующие методы. Метод
  347. <code>columns()</code> позволяет добавлять определенные столбцы
  348. в любой момент до того, как будет выполнен запрос. Вы можете
  349. передавать столбцы в виде строки, объекта
  350. <code>Zend_Db_Expr</code> или массива этих элементов. Второй
  351. аргумент этого метода может быть опущен, это значит, что столбцы
  352. должны быть добавлены в таблицу FROM, иначе должно
  353. использоваться существующее корреляционное имя.
  354. </para>
  355. <example id="zend.db.select.building.columns-atomic.example">
  356. <title>Пример добавления столбцов через метод <code>columns()</code></title>
  357. <programlisting language="php"><![CDATA[
  358. // Строится следующий запрос:
  359. // SELECT p."product_id", p."product_name"
  360. // FROM "products" AS p
  361. $select = $db->select()
  362. ->from(array('p' => 'products'), 'product_id')
  363. ->columns('product_name');
  364. // Строится тот же запрос с указанием корреляционных имен:
  365. // SELECT p."product_id", p."product_name"
  366. // FROM "products" AS p
  367. $select = $db->select()
  368. ->from(array('p' => 'products'), 'p.product_id')
  369. ->columns('product_name', 'p');
  370. // Можно также писать: columns('p.product_name')]]>
  371. </programlisting>
  372. </example>
  373. </sect3>
  374. <sect3 id="zend.db.select.building.join">
  375. <title>Добавление в запрос другой таблицы c помощью JOIN</title>
  376. <para>
  377. Многие полезные запросы используют <code>JOIN</code> для
  378. объединения строк из разных таблиц. Вы можете добавлять таблицы
  379. в запрос, используя метод <code>join()</code> объекта
  380. Zend_Db_Select. Использование этого метода похоже на
  381. использование <code>from()</code> за тем исключением, что в
  382. большинстве случаев вам нужно будет также указать условие
  383. объединения.
  384. </para>
  385. <example id="zend.db.select.building.join.example">
  386. <title>Пример использования метода join()</title>
  387. <programlisting language="php"><![CDATA[
  388. // Строит запрос:
  389. // SELECT p."product_id", p."product_name", l.*
  390. // FROM "products" AS p JOIN "line_items" AS l
  391. // ON p.product_id = l.product_id
  392. $select = $db->select()
  393. ->from(array('p' => 'products'),
  394. array('product_id', 'product_name'))
  395. ->join(array('l' => 'line_items'),
  396. 'p.product_id = l.product_id');
  397. ]]>
  398. </programlisting>
  399. </example>
  400. <para>
  401. Второй аргумент метода <code>join()</code> является строкой,
  402. содержащей условие объединения. Это выражение объявляет условие,
  403. при выполнении которого строки в одной таблице объединяются со
  404. сроками в другой таблице. Вы можете использовать корреляционные
  405. имена в этом выражении.
  406. </para>
  407. <note>
  408. <para>
  409. К выражению, указанному вами как условие объединения, не
  410. применяется автоматическое заключение в кавычки. Если нужно
  411. заключить в кавычки имена столбцов, то используйте
  412. <code>quoteIdentifier()</code> при формировании строки
  413. условия объединения.
  414. </para>
  415. </note>
  416. <para>
  417. Третий аргумент метода <code>join()</code> - массив имен
  418. столбцов, как и в методе <code>from()</code>. По умолчанию
  419. используется "<code>*</code>" вместо столбцов,
  420. поддерживаются корреляционные имена, выражения и Zend_Db_Expr -
  421. так же, как и в случае массива столбцов для метода
  422. <code>from()</code>.
  423. </para>
  424. <para>
  425. Если из таблицы не нужно выбирать столбцы, то используйте пустой
  426. массив вместо перечисления столбцов. Это работает и для метода
  427. <code>from()</code>, но обычно требуется извлечь часть столбцов
  428. из основной таблицы в запросе, при этом может не требоваться
  429. получение столбцов из присоединяемой таблицы.
  430. </para>
  431. <example id="zend.db.select.building.join.example-no-columns">
  432. <title>Пример извлечения без столбцов</title>
  433. <programlisting language="php"><![CDATA[
  434. // Строит запрос:
  435. // SELECT p."product_id", p."product_name"
  436. // FROM "products" AS p JOIN "line_items" AS l
  437. // ON p.product_id = l.product_id
  438. $select = $db->select()
  439. ->from(array('p' => 'products'),
  440. array('product_id', 'product_name'))
  441. ->join(array('l' => 'line_items'),
  442. 'p.product_id = l.product_id',
  443. array() ); // empty list of columns
  444. ]]>
  445. </programlisting>
  446. <para>
  447. Обратите внимание на пустой <code>array()</code> в примере
  448. выше вместо списка столбцов из присоединяемой таблицы.
  449. </para>
  450. </example>
  451. <para>
  452. SQL имеет несколько типов объединений. Ниже приведен список
  453. методов для поддержки различных типов объединений в
  454. Zend_Db_Select.
  455. </para>
  456. <itemizedlist>
  457. <listitem>
  458. <para>
  459. <command>INNER JOIN</command>, методы
  460. <code>join(table, join, [columns])</code>
  461. и <code>joinInner(table, join, [columns])</code>.
  462. </para>
  463. <para>
  464. Возможно, наиболее часто используемый тип объединения.
  465. Строки из каждой таблицы сравниваются с
  466. использованием условия сравнения. Результат включает в
  467. себя только те строки, которые удовлетворяют условию
  468. объединения. Результат может быть пустым, если ни одна
  469. строка не удовлетворяет этому условию.
  470. </para>
  471. <para>
  472. Все СУРБД поддерживают этот тип объединения.
  473. </para>
  474. </listitem>
  475. <listitem>
  476. <para>
  477. <command>LEFT JOIN</command>, метод <code>joinLeft(table, condition, [columns])</code>.
  478. </para>
  479. <para>
  480. В результат входят все строки из таблицы слева и все
  481. соответствующие строки из таблицы справа. Если нет
  482. соответствующих строк из таблицы справа, то
  483. соответствующие столбцы в результате заполняются NULL.
  484. </para>
  485. <para>
  486. Все СУРБД поддерживают этот тип объединения.
  487. </para>
  488. </listitem>
  489. <listitem>
  490. <para>
  491. <command>RIGHT JOIN</command>, метод <code>joinRight(table, condition, [columns])</code>.
  492. </para>
  493. <para>
  494. Правое внешнее объединение дополняет левое внешнее
  495. объединение. В результат входят все строки из таблицы
  496. справа и все соответствующие строки из таблицы слева.
  497. Если нет соответствующих строк из таблицы слева, то
  498. соответствующие столбцы в результате заполняются NULL.
  499. </para>
  500. <para>
  501. Некоторые СУРБД не поддерживают этот тип объединения,
  502. но, как правило, любое правое объединение может быть
  503. заменено на левое посредством изменения порядка таблиц
  504. на обратный.
  505. </para>
  506. </listitem>
  507. <listitem>
  508. <para>
  509. <command>FULL JOIN</command>, метод
  510. <code>joinFull(table, condition, [columns])</code>.
  511. </para>
  512. <para>
  513. Полное внешнее объединение является как бы комбинацией
  514. левого и правого объединений. Все строки из обоих таблиц
  515. входят в результат, при этом объединяются друг с другом
  516. в одну строку результата, если соответствуют условию
  517. объединения, иначе объединяются с NULL вместо значений
  518. столбцов из другой таблицы.
  519. </para>
  520. <para>
  521. Некоторые СУРБД не поддерживают этот тип объединения.
  522. </para>
  523. </listitem>
  524. <listitem>
  525. <para>
  526. <command>CROSS JOIN</command>, метод
  527. <code>joinCross(table, [columns])</code>.
  528. </para>
  529. <para>
  530. Перекрестное объединение является декартовым
  531. произведением. Каждая строка в первой таблице
  532. объединяется с со всеми строками во второй таблице.
  533. Таким образом, количество строк в результате будет равно
  534. произведению числа строк в обоих таблицах. Вы можете
  535. фильтровать результат, используя условие в предложении
  536. WHERE, в этом случае перекрестное объединение подобно
  537. старому синтаксису объединений в SQL-89.
  538. </para>
  539. <para>
  540. Метод <code>joinCross()</code> не имеет параметров для
  541. определения условий объединения. Некоторые СУРБД не
  542. поддерживают этот тип объединения.
  543. </para>
  544. </listitem>
  545. <listitem>
  546. <para>
  547. <command>NATURAL JOIN</command>, метод
  548. <code>joinNatural(table, [columns])</code>.
  549. </para>
  550. <para>
  551. Естественное объединение сравнивает столбцы, имеющие
  552. одинаковые имена в обоих таблицах. Проверка производится
  553. на равенство; проверка на неравенство не является
  554. естественным объединением.
  555. Данным API поддерживаются только внутренние
  556. естественные объединения, даже если SQL поддерживает
  557. внешние естественные объединения.
  558. </para>
  559. <para>
  560. Метод <code>joinNatural()</code> не имеет параметров для
  561. определения условий объединения.
  562. </para>
  563. </listitem>
  564. </itemizedlist>
  565. <para>
  566. В дополнение к этим методам объединения вы можете упростить свои
  567. запросы, используя методы JoinUsing. Вместо предоставления
  568. полного условия объединения вы можете просто передавать имя
  569. столбца, по которому производится объединение, и Zend_Db_Select
  570. допишет условие объединения за вас.
  571. </para>
  572. <example id="zend.db.select.building.joinusing.example">
  573. <title>Пример использования метода joinUsing()</title>
  574. <programlisting language="php"><![CDATA[
  575. // Строится запрос:
  576. // SELECT *
  577. // FROM "table1"
  578. // JOIN "table2"
  579. // ON "table1".column1 = "table2".column1
  580. // WHERE column2 = 'foo'
  581. $select = $db->select()
  582. ->from('table1')
  583. ->joinUsing('table2', 'column1')
  584. ->where('column2 = ?', 'foo');]]>
  585. </programlisting>
  586. </example>
  587. <para>
  588. Каждый метод объединения из перечисленных выше имеет соответствующий ему метод JoinUsing.
  589. </para>
  590. <itemizedlist>
  591. <listitem>
  592. <para>
  593. <code>joinUsing(table, join, [columns])</code> и
  594. <code>joinInnerUsing(table, join, [columns])</code>
  595. </para>
  596. </listitem>
  597. <listitem>
  598. <para>
  599. <code>joinLeftUsing(table, join, [columns])</code>
  600. </para>
  601. </listitem>
  602. <listitem>
  603. <para>
  604. <code>joinRightUsing(table, join, [columns])</code>
  605. </para>
  606. </listitem>
  607. <listitem>
  608. <para>
  609. <code>joinFullUsing(table, join, [columns])</code>
  610. </para>
  611. </listitem>
  612. </itemizedlist>
  613. </sect3>
  614. <sect3 id="zend.db.select.building.where">
  615. <title>Добавление предложения WHERE</title>
  616. <para>
  617. Вы можете задавать условия для ограничения строк в результате
  618. выборки, используя метод <code>where()</code>. Первым аргументом
  619. этого метода является SQL-выражение, которое используется в
  620. предложении <code>WHERE</code> в данном запросе.
  621. </para>
  622. <example id="zend.db.select.building.where.example">
  623. <title>Пример использования метода where()</title>
  624. <programlisting language="php"><![CDATA[
  625. // Строится запрос:
  626. // SELECT product_id, product_name, price
  627. // FROM "products"
  628. // WHERE price > 100.00
  629. $select = $db->select()
  630. ->from('products',
  631. array('product_id', 'product_name', 'price'))
  632. ->where('price > 100.00');]]>
  633. </programlisting>
  634. </example>
  635. <note>
  636. <para>
  637. К выражениям для методов <code>where()</code> или
  638. <code>orWhere()</code> не применяется автоматическое
  639. заключение в кавычки. Если необходимо, чтобы имена столбцов
  640. были заключены в кавычки, то используйте метод
  641. <code>quoteIdentifier()</code> при формировании строки
  642. условия.
  643. </para>
  644. </note>
  645. <para>
  646. Второй аргумент метода <code>where()</code> является
  647. опциональным. Это значение подставляется в выражение.
  648. Zend_Db_Select заключает это значение в кавычки и подставляет
  649. вместо знака вопроса ("<code>?</code>") в выражении.
  650. </para>
  651. <para>
  652. Этот метод принимает только один параметр. Если в выражение
  653. подставляется несколько значений, то нужно сформировать строку
  654. вручную, вставляя переменные и заключая их в кавычки
  655. самостоятельно.
  656. </para>
  657. <example id="zend.db.select.building.where.example-param">
  658. <title>Пример параметра в методе where()</title>
  659. <programlisting language="php"><![CDATA[
  660. // Строит запрос:
  661. // SELECT product_id, product_name, price
  662. // FROM "products"
  663. // WHERE (price > 100.00)
  664. $minimumPrice = 100;
  665. $select = $db->select()
  666. ->from('products',
  667. array('product_id', 'product_name', 'price'))
  668. ->where('price > ?', $minimumPrice);
  669. ]]>
  670. </programlisting>
  671. </example>
  672. <para>
  673. Вы можете вызывать метод <code>where()</code> несколько раз на
  674. одном и том же объекте Zend_Db_Select. Результирующий запрос
  675. объединяет в себе все термы с добавлением <code>AND</code>
  676. между ними.
  677. </para>
  678. <example id="zend.db.select.building.where.example-and">
  679. <title>Пример нескольких вызовов метода where()</title>
  680. <programlisting language="php"><![CDATA[
  681. // Строит запрос:
  682. // SELECT product_id, product_name, price
  683. // FROM "products"
  684. // WHERE (price > 100.00)
  685. // AND (price < 500.00)
  686. $minimumPrice = 100;
  687. $maximumPrice = 500;
  688. $select = $db->select()
  689. ->from('products',
  690. array('product_id', 'product_name', 'price'))
  691. ->where('price > ?', $minimumPrice)
  692. ->where('price < ?', $maximumPrice);
  693. ]]>
  694. </programlisting>
  695. </example>
  696. <para>
  697. Если вам нужно объединить термы с использованием
  698. <code>OR</code>, то используйте метод <code>orWhere()</code>.
  699. Этот метод используется так же, как и метод
  700. <code>where()</code>, за тем исключением, что определенный в
  701. этом вызове терм добавляется вместе с <code>OR</code> вместо
  702. <code>AND</code>.
  703. </para>
  704. <example id="zend.db.select.building.where.example-or">
  705. <title>Пример использования метода orWhere()</title>
  706. <programlisting language="php"><![CDATA[
  707. // Строит запрос:
  708. // SELECT product_id, product_name, price
  709. // FROM "products"
  710. // WHERE (price < 100.00)
  711. // OR (price > 500.00)
  712. $minimumPrice = 100;
  713. $maximumPrice = 500;
  714. $select = $db->select()
  715. ->from('products',
  716. array('product_id', 'product_name', 'price'))
  717. ->where('price < ?', $minimumPrice)
  718. ->orWhere('price > ?', $maximumPrice);
  719. ]]>
  720. </programlisting>
  721. </example>
  722. <para>
  723. Zend_Db_Select автоматически заключает в скобки все выражения,
  724. которые вы добавляете через методы <code>where()</code> или
  725. <code>orWhere()</code>. Это позволяет быть уверенным в том, что
  726. приоритет булевых операторов не приведет к другому результату
  727. вместо ожидаемого.
  728. </para>
  729. <example id="zend.db.select.building.where.example-parens">
  730. <title>Пример заключения булевых выражений в скобки</title>
  731. <programlisting language="php"><![CDATA[
  732. // Строит запрос:
  733. // SELECT product_id, product_name, price
  734. // FROM "products"
  735. // WHERE (price < 100.00 OR price > 500.00)
  736. // AND (product_name = 'Apple')
  737. $minimumPrice = 100;
  738. $maximumPrice = 500;
  739. $prod = 'Apple';
  740. $select = $db->select()
  741. ->from('products',
  742. array('product_id', 'product_name', 'price'))
  743. ->where("price < $minimumPrice OR price > $maximumPrice")
  744. ->where('product_name = ?', $prod);
  745. ]]>
  746. </programlisting>
  747. </example>
  748. <para>
  749. В примере выше результаты могут отличаться от тех, что
  750. получаются без скобок, потому что <code>AND</code> имеет больший
  751. приоритет, чем <code>OR</code>. Zend_Db_Select добавляет скобки,
  752. Таким образом, результатом является то, что каждое выражение,
  753. добавленное в успешных вызовах <code>where()</code> более
  754. связанно, чем <code>AND</code>, объединяющее эти выражения.
  755. </para>
  756. </sect3>
  757. <sect3 id="zend.db.select.building.group">
  758. <title>Добавление предложения GROUP BY</title>
  759. <para>
  760. В языке SQL выражение <code>GROUP BY</code> позволяет ограничить
  761. количество строк в результатах запроса до одной стоки на каждое
  762. уникальное значение в столбцах, перечисленных в предложении
  763. <code>GROUP BY</code>.
  764. </para>
  765. <para>
  766. В Zend_Db_Select вы можете задавать столбцы, используемые для
  767. определения групп строк, через метод <code>group()</code>.
  768. Аргументом этого метода является столбец или массив столбцов для
  769. подстановки в предложение <code>GROUP BY</code>.
  770. </para>
  771. <example id="zend.db.select.building.group.example">
  772. <title>Пример использования метода group()</title>
  773. <programlisting language="php"><![CDATA[
  774. // Строит запрос:
  775. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  776. // FROM "products" AS p JOIN "line_items" AS l
  777. // ON p.product_id = l.product_id
  778. // GROUP BY p.product_id
  779. $select = $db->select()
  780. ->from(array('p' => 'products'),
  781. array('product_id'))
  782. ->join(array('l' => 'line_items'),
  783. 'p.product_id = l.product_id',
  784. array('line_items_per_product' => 'COUNT(*)'))
  785. ->group('p.product_id');
  786. ]]>
  787. </programlisting>
  788. </example>
  789. <para>
  790. Как и для массива столбцов в методе <code>from()</code>, вы
  791. можете использовать корреляционные имена в именах столбцов,
  792. столбцы заключаются в кавычки в качестве идентификаторов, если
  793. строка не содержит скобок или является объектом типа
  794. Zend_Db_Expr.
  795. </para>
  796. </sect3>
  797. <sect3 id="zend.db.select.building.having">
  798. <title>Добавление предложения HAVING</title>
  799. <para>
  800. В SQL предложение <code>HAVING</code> применяет условие
  801. ограничения к группам строк. Это подобно тому, как предложение
  802. <code>WHERE</code> применяет условие ограничения к строкам.
  803. Но эти предложения не являются идентичными, поскольку условия
  804. <code>WHERE</code> применяются до группировки, в то время как
  805. условия <code>HAVING</code> применяется после группировки.
  806. </para>
  807. <para>
  808. В Zend_Db_Select вы можете определять условия ограничения
  809. групп через метод <code>having()</code>. Его использование
  810. аналогично использованию метода <code>where()</code>. Первый
  811. аргумент является строкой, содержащей SQL-выражение.
  812. Опциональный второй аргумент - значение, которое используется
  813. для подстановки вместо метки заполнения в SQL-выражении.
  814. Выражения, переданные в нескольких вызовах метода
  815. <code>having()</code>, объединяются через булевый оператор
  816. <code>AND</code> или через булевый оператор
  817. <code>OR</code>, если вы используете метод
  818. <code>orHaving()</code>.
  819. </para>
  820. <example id="zend.db.select.building.having.example">
  821. <title>Пример использования метода having()</title>
  822. <programlisting language="php"><![CDATA[
  823. // Строит запрос:
  824. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  825. // FROM "products" AS p JOIN "line_items" AS l
  826. // ON p.product_id = l.product_id
  827. // GROUP BY p.product_id
  828. // HAVING line_items_per_product > 10
  829. $select = $db->select()
  830. ->from(array('p' => 'products'),
  831. array('product_id'))
  832. ->join(array('l' => 'line_items'),
  833. 'p.product_id = l.product_id',
  834. array('line_items_per_product' => 'COUNT(*)'))
  835. ->group('p.product_id')
  836. ->having('line_items_per_product > 10');
  837. ]]>
  838. </programlisting>
  839. </example>
  840. <note>
  841. <para>
  842. К выражениям, переданным через методы <code>having()</code>
  843. или <code>orHaving()</code>, не применяется автоматическое
  844. заключение в кавычки. Если у вас есть имена столбцов,
  845. которые требуется заключить в кавычки, то используйте
  846. <code>quoteIdentifier()</code> при формировании строки
  847. условия.
  848. </para>
  849. </note>
  850. </sect3>
  851. <sect3 id="zend.db.select.building.order">
  852. <title>Добавление предложения ORDER BY</title>
  853. <para>
  854. В SQL предложение <code>ORDER BY</code> задает один или более
  855. столбцов (или выражений), по которым сортируется результат
  856. запроса. Если перечислено несколько столбцов, то вторичные
  857. столбцы используются для принятия решения в ситуации "ничьи":
  858. если первичные столбцы содержат идентичные значения, то порядок
  859. сортировки определяется через вторичные столбцы. По умолчанию
  860. сортировка производится от меньших значений к большим. Вы можете
  861. также производить для данного столбца сортировку от больших
  862. значений к меньшим, указав ключевое слово <code>DESC</code>
  863. после этого столбца.
  864. </para>
  865. <para>
  866. В Zend_Db_Select вы можете использовать метод
  867. <code>order()</code> для определения столбца или массива
  868. столбцов, по которым производится сортировка. Каждый элемент
  869. массива является строкой с именем столбца, опционально строка
  870. может содержать ключевое слово <code>ASC</code> или
  871. <code>DESC</code> после имени столбца и отделенное от него
  872. пробелом.
  873. </para>
  874. <para>
  875. Как и в случае методов <code>from()</code> и
  876. <code>group()</code>, имена столбцов заключаются в кавычки в
  877. качестве идентификаторов, если они не содержат скобки и не
  878. являются объектами Zend_Db_Expr.
  879. </para>
  880. <example id="zend.db.select.building.order.example">
  881. <title>Пример использования метода order()</title>
  882. <programlisting language="php"><![CDATA[
  883. // Строит запрос:
  884. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  885. // FROM "products" AS p JOIN "line_items" AS l
  886. // ON p.product_id = l.product_id
  887. // GROUP BY p.product_id
  888. // ORDER BY "line_items_per_product" DESC, "product_id"
  889. $select = $db->select()
  890. ->from(array('p' => 'products'),
  891. array('product_id'))
  892. ->join(array('l' => 'line_items'),
  893. 'p.product_id = l.product_id',
  894. array('line_items_per_product' => 'COUNT(*)'))
  895. ->group('p.product_id')
  896. ->order(array('line_items_per_product DESC',
  897. 'product_id'));
  898. ]]>
  899. </programlisting>
  900. </example>
  901. </sect3>
  902. <sect3 id="zend.db.select.building.limit">
  903. <title>Добавление предложения LIMIT</title>
  904. <para>
  905. Некоторые СУРБД расширяют язык SQL предложением, известным как
  906. предложение <code>LIMIT</code>. Это предложение ограничивает
  907. количество строк в результате запроса до заданного вами
  908. количества. Вы можете также задать количество пропускаемых до
  909. начала вывода строк. Эта возможность облегчает выборку
  910. подмножества строк результата - например, для постраничного
  911. вывода результатов запроса.
  912. </para>
  913. <para>
  914. В Zend_Db_Select вы можете использовать метод
  915. <code>limit()</code> для задания количества строк в выборке и
  916. количества пропускаемых строк. Первым аргументом этого метода
  917. является желаемое количество строк в результате запроса. Вторым
  918. аргументом - количество пропускаемых строк
  919. </para>
  920. <example id="zend.db.select.building.limit.example">
  921. <title>Пример использования метода limit()</title>
  922. <programlisting language="php"><![CDATA[
  923. // Строит запрос:
  924. // SELECT p."product_id", p."product_name"
  925. // FROM "products" AS p
  926. // LIMIT 10, 20
  927. $select = $db->select()
  928. ->from(array('p' => 'products'),
  929. array('product_id', 'product_name'))
  930. ->limit(10, 20);
  931. ]]>
  932. </programlisting>
  933. </example>
  934. <note>
  935. <para>
  936. Ситаксис <code>LIMIT</code> поддерживается не всеми СУРБД.
  937. Некоторые СУРБД используют другой синтаксис для поддержки
  938. аналогичной функциональности. Каждый класс
  939. Zend_Db_Adapter_Abstract включает в себя метод для генерации
  940. SQL, присущего данной СУРБД.
  941. </para>
  942. </note>
  943. <para>
  944. Используйте метод <code>limitPage()</code> в качестве
  945. альтернативного способа указания количества строк и смещения.
  946. Этот метод позволяет ограничить набор возвращаемых результатов
  947. подмножеством фиксированной длины, который является одним из
  948. последовательности подмножеств, составляющих весь набор
  949. результатов запроса.
  950. Другими словами, вы указываете длину "страницы" результатов в
  951. строках и порядковый номер страницы для извлечения. Номер
  952. страницы является первым аргументом в методе
  953. <code>limitPage()</code>, а длина страницы - вторым. Оба
  954. аргумента являются обязательными и не имеют значений по
  955. умолчанию.
  956. </para>
  957. <example id="zend.db.select.building.limit.example2">
  958. <title>Пример использования метода limitPage()</title>
  959. <programlisting language="php"><![CDATA[
  960. // Строит запрос:
  961. // SELECT p."product_id", p."product_name"
  962. // FROM "products" AS p
  963. // LIMIT 10, 20
  964. $select = $db->select()
  965. ->from(array('p' => 'products'),
  966. array('product_id', 'product_name'))
  967. ->limitPage(2, 10);
  968. ]]>
  969. </programlisting>
  970. </example>
  971. </sect3>
  972. <sect3 id="zend.db.select.building.distinct">
  973. <title>Добавление модификатора DISTINCT</title>
  974. <para>
  975. Метод <code>distinct()</code> дает возможность добавлять
  976. ключевое слово <code>DISTINCT</code> в ваш запрос.
  977. </para>
  978. <example id="zend.db.select.building.distinct.example">
  979. <title>Пример использования метода distinct()</title>
  980. <programlisting language="php"><![CDATA[
  981. // Строит запрос:
  982. // SELECT DISTINCT p."product_name"
  983. // FROM "products" AS p
  984. $select = $db->select()
  985. ->distinct()
  986. ->from(array('p' => 'products'), 'product_name');
  987. ]]>
  988. </programlisting>
  989. </example>
  990. </sect3>
  991. <sect3 id="zend.db.select.building.for-update">
  992. <title>Добавление модификатора FOR UPDATE</title>
  993. <para>
  994. Метод <code>forUpdate()</code> дает возможность добавлять
  995. модификатор <code>FOR UPDATE</code> в ваш запрос.
  996. </para>
  997. <example id="zend.db.select.building.for-update.example">
  998. <title>Пример использования метода forUpdate()</title>
  999. <programlisting language="php"><![CDATA[
  1000. // Строит запрос:
  1001. // SELECT FOR UPDATE p.*
  1002. // FROM "products" AS p
  1003. $select = $db->select()
  1004. ->forUpdate()
  1005. ->from(array('p' => 'products'));
  1006. ]]>
  1007. </programlisting>
  1008. </example>
  1009. </sect3>
  1010. </sect2>
  1011. <sect2 id="zend.db.select.execute">
  1012. <title>Произведение запросов на выборку</title>
  1013. <para>
  1014. Этот раздел объясняет, как производить запрос, представленный
  1015. объектом Zend_Db_Select.
  1016. </para>
  1017. <sect3 id="zend.db.select.execute.query-adapter">
  1018. <title>Произведение запросов на выборку из адаптера БД</title>
  1019. <para>
  1020. Вы можете производить запрос, представленный объектом
  1021. Zend_Db_Select, посредством передачи его в качестве первого
  1022. аргумента методу <code>query()</code> объекта
  1023. Zend_Db_Adapter_Abstract. Используйте объекты Zend_Db_Select
  1024. вместо строк запроса.
  1025. </para>
  1026. <para>
  1027. Метод <code>query()</code> возвращает объект Zend_Db_Statement
  1028. или PDOStatement, в зависимости от типа адаптера.
  1029. </para>
  1030. <example id="zend.db.select.execute.query-adapter.example">
  1031. <title>Пример использования метода query() адаптера БД</title>
  1032. <programlisting language="php"><![CDATA[
  1033. $select = $db->select()
  1034. ->from('products');
  1035. $stmt = $db->query($select);
  1036. $result = $stmt->fetchAll();
  1037. ]]>
  1038. </programlisting>
  1039. </example>
  1040. </sect3>
  1041. <sect3 id="zend.db.select.execute.query-select">
  1042. <title>Произведение запросов на выборку через объект Select</title>
  1043. <para>
  1044. Вместо метода <code>query()</code> объекта адаптера можно
  1045. использовать метод <code>query()</code> объекта Zend_Db_Select.
  1046. Оба метода возвращают объект типа Zend_Db_Statement или
  1047. PDOStatement, в зависимости от типа адаптера.
  1048. </para>
  1049. <example id="zend.db.select.execute.query-select.example">
  1050. <title>Пример использования метода query() объекта Select</title>
  1051. <programlisting language="php"><![CDATA[
  1052. $select = $db->select()
  1053. ->from('products');
  1054. $stmt = $select->query();
  1055. $result = $stmt->fetchAll();
  1056. ]]>
  1057. </programlisting>
  1058. </example>
  1059. </sect3>
  1060. <sect3 id="zend.db.select.execute.tostring">
  1061. <title>Преобразование объекта Select в SQL-строку</title>
  1062. <para>
  1063. Если нужно получить доступ к строковому представлению
  1064. SQL-запроса, соответствующего данному объекту Zend_Db_Select, то
  1065. используйте метод <code>__toString()</code>.
  1066. </para>
  1067. <example id="zend.db.select.execute.tostring.example">
  1068. <title>Пример использования метода __toString()</title>
  1069. <programlisting language="php"><![CDATA[
  1070. $select = $db->select()
  1071. ->from('products');
  1072. $sql = $select->__toString();
  1073. echo "$sql\n";
  1074. // Выводится будет строка:
  1075. // SELECT * FROM "products"
  1076. ]]>
  1077. </programlisting>
  1078. </example>
  1079. </sect3>
  1080. </sect2>
  1081. <sect2 id="zend.db.select.other">
  1082. <title>Другие методы</title>
  1083. <para>
  1084. Этот раздел описывает другие методы класса Zend_Db_Select, которые
  1085. не были охвачены ранее: <code>getPart()</code> и
  1086. <code>reset()</code>.
  1087. </para>
  1088. <sect3 id="zend.db.select.other.get-part">
  1089. <title>Получение частей объекта Select</title>
  1090. <para>
  1091. Метод <code>getPart()</code> возвращает представление
  1092. определенной части вашего запроса. Например, вы можете
  1093. использовать этот метод для получения строки выражения для
  1094. предложения <code>WHERE</code>, массива столбцов, перечисленных
  1095. для получения выборки по ним, значений количества и смещения для
  1096. предложения <code>LIMIT</code>.
  1097. </para>
  1098. <para>
  1099. Возвращаемое значение не является строкой, содержащей фрагмент
  1100. запроса SQL. Возвращаемое значение является внутренним
  1101. представлением в объекте, обычно это массив, содержащий значения
  1102. и выражения. Каждая часть запроса имеет различную структуру.
  1103. </para>
  1104. <para>
  1105. Единственным аргументом метода <code>getPart()</code> является
  1106. строка, идентифицирующая часть запроса, которую требуется
  1107. вернуть. Например, строка <code>'from'</code> соответствует той
  1108. части запроса, которая хранит информацию о таблицах в
  1109. предложении <code>FROM</code>, включая присоединяемые таблицы.
  1110. </para>
  1111. <para>
  1112. Zend_Db_Select определяет константы, которые вы можете
  1113. использовать для частей SQL-запроса. Вы можете использовать эти
  1114. константы или литеральные строки.
  1115. </para>
  1116. <table id="zend.db.select.other.get-part.table">
  1117. <title>Константы, используемые методами getPart() и reset()</title>
  1118. <tgroup cols="2">
  1119. <thead>
  1120. <row>
  1121. <entry>Константа</entry>
  1122. <entry>Строковое значение</entry>
  1123. </row>
  1124. </thead>
  1125. <tbody>
  1126. <row>
  1127. <entry><code>Zend_Db_Select::DISTINCT</code></entry>
  1128. <entry><code>'distinct'</code></entry>
  1129. </row>
  1130. <row>
  1131. <entry><code>Zend_Db_Select::FOR_UPDATE</code></entry>
  1132. <entry><code>'forupdate'</code></entry>
  1133. </row>
  1134. <row>
  1135. <entry><code>Zend_Db_Select::COLUMNS</code></entry>
  1136. <entry><code>'columns'</code></entry>
  1137. </row>
  1138. <row>
  1139. <entry><code>Zend_Db_Select::FROM</code></entry>
  1140. <entry><code>'from'</code></entry>
  1141. </row>
  1142. <row>
  1143. <entry><code>Zend_Db_Select::WHERE</code></entry>
  1144. <entry><code>'where'</code></entry>
  1145. </row>
  1146. <row>
  1147. <entry><code>Zend_Db_Select::GROUP</code></entry>
  1148. <entry><code>'group'</code></entry>
  1149. </row>
  1150. <row>
  1151. <entry><code>Zend_Db_Select::HAVING</code></entry>
  1152. <entry><code>'having'</code></entry>
  1153. </row>
  1154. <row>
  1155. <entry><code>Zend_Db_Select::ORDER</code></entry>
  1156. <entry><code>'order'</code></entry>
  1157. </row>
  1158. <row>
  1159. <entry><code>Zend_Db_Select::LIMIT_COUNT</code></entry>
  1160. <entry><code>'limitcount'</code></entry>
  1161. </row>
  1162. <row>
  1163. <entry><code>Zend_Db_Select::LIMIT_OFFSET</code></entry>
  1164. <entry><code>'limitoffset'</code></entry>
  1165. </row>
  1166. </tbody>
  1167. </tgroup>
  1168. </table>
  1169. <example id="zend.db.select.other.get-part.example">
  1170. <title>Пример использования метода getPart()</title>
  1171. <programlisting language="php"><![CDATA[
  1172. $select = $db->select()
  1173. ->from('products')
  1174. ->order('product_id');
  1175. // Вы можете использовать строковой литерал для указания части запроса
  1176. $orderData = $select->getPart( 'order' );
  1177. // Можно использовать константу для указания той же части
  1178. $orderData = $select->getPart( Zend_Db_Select::ORDER );
  1179. // Возвращаемое значение может быть массивом, а не строкой
  1180. // Каждая часть имет свою структуру
  1181. print_r( $orderData );
  1182. ]]>
  1183. </programlisting>
  1184. </example>
  1185. </sect3>
  1186. <sect3 id="zend.db.select.other.reset">
  1187. <title>Сброс частей запроса в объекте Select</title>
  1188. <para>
  1189. Через метод <code>reset()</code> вы можете очистить
  1190. определенную часть SQL-запроса или все части запроса, если
  1191. опустить аргумент.
  1192. </para>
  1193. <para>
  1194. Единственный аргумент метода является опциональным. Вы можете
  1195. указать часть запроса для очистки, используя те же строки,
  1196. которые используются для метода <code>getPart()</code>. Та часть
  1197. запроса, которую вы указали, сбрасывается в состояние по
  1198. умолчанию.
  1199. </para>
  1200. <para>
  1201. Если вы опустите этот параметр, то <code>reset()</code>
  1202. сбрасывает все части запроса в состояние по умолчанию. Это
  1203. делает объект Zend_Db_Select эквивалентным новому объекту - так
  1204. же, как если бы вы его только что инстанцировали его.
  1205. </para>
  1206. <example id="zend.db.select.other.reset.example">
  1207. <title>Пример использования метода reset()</title>
  1208. <programlisting language="php"><![CDATA[
  1209. // Строит запрос:
  1210. // SELECT p.*
  1211. // FROM "products" AS p
  1212. // ORDER BY "product_name"
  1213. $select = $db->select()
  1214. ->from(array('p' => 'products')
  1215. ->order('product_name');
  1216. // Changed requirement, instead order by a different columns:
  1217. // Теперь нужна сортировка по другому столбцу:
  1218. // SELECT p.*
  1219. // FROM "products" AS p
  1220. // ORDER BY "product_id"
  1221. // Очищаем соответствующую часть, теперь можно переопределить ее
  1222. $select->reset( Zend_Db_Select::ORDER );
  1223. // Задаем другой столбец
  1224. $select->order('product_id');
  1225. // Очищаем все части запроса
  1226. $select->reset();
  1227. ]]>
  1228. </programlisting>
  1229. </example>
  1230. </sect3>
  1231. </sect2>
  1232. </sect1>
  1233. <!--
  1234. vim:se ts=4 sw=4 et:
  1235. -->