Zend_Db_Select.xml 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 19162 -->
  4. <sect1 id="zend.db.select">
  5. <title>Zend_Db_Select</title>
  6. <sect2 id="zend.db.select.introduction">
  7. <title>導入</title>
  8. <para>
  9. <classname>Zend_Db_Select</classname> オブジェクトは、<acronym>SQL</acronym> の <acronym>SELECT</acronym> 文を表すものです。
  10. このクラスには、クエリの各部分を追加するためのメソッドが用意されています。
  11. <acronym>PHP</acronym> のメソッドやデータをもとにクエリの各部分を指定すると、
  12. このクラスが正確な <acronym>SQL</acronym> 文を作成してくれます。クエリを作成したら、
  13. あとは通常の文字列と同じようにそれを用いてクエリを実行できます。
  14. </para>
  15. <para>
  16. <classname>Zend_Db_Select</classname> は次のような機能を提供します。
  17. </para>
  18. <itemizedlist>
  19. <listitem>
  20. <para>
  21. <acronym>SQL</acronym> クエリを少しずつ組み立てていくための
  22. オブジェクト指向のメソッド
  23. </para>
  24. </listitem>
  25. <listitem>
  26. <para>
  27. <acronym>SQL</acronym> クエリの一部について、データベースに依存しない抽象化
  28. </para>
  29. </listitem>
  30. <listitem>
  31. <para>
  32. 大半のメタデータ識別子の自動クォート処理による、
  33. 予約語や特殊文字を含む <acronym>SQL</acronym> のサポート
  34. </para>
  35. </listitem>
  36. <listitem>
  37. <para>
  38. 識別子や値のクォートによる、
  39. <acronym>SQL</acronym> インジェクション攻撃対策
  40. </para>
  41. </listitem>
  42. </itemizedlist>
  43. <para>
  44. 必ず <classname>Zend_Db_Select</classname> を使わなければならないというわけではありません。
  45. 単純な SELECT クエリを実行するのなら、<acronym>SQL</acronym> クエリ全体を文字列で指定し、
  46. アダプタの <methodname>query()</methodname> メソッドや <methodname>fetchAll()</methodname>
  47. メソッドを使用したほうがずっとシンプルになるでしょう。
  48. <classname>Zend_Db_Select</classname> を使うと便利なのは、
  49. 何らかの条件にもとづいて、アプリケーション内で
  50. SELECT クエリを動的に組み立てていく必要があるような場合です。
  51. </para>
  52. </sect2>
  53. <sect2 id="zend.db.select.creating">
  54. <title>Select オブジェクトの作成</title>
  55. <para>
  56. <classname>Zend_Db_Select</classname> オブジェクトのインスタンスを作成するには、
  57. <classname>Zend_Db_Adapter_Abstract</classname> オブジェクトの
  58. <methodname>select()</methodname> メソッドを使用します。
  59. </para>
  60. <example id="zend.db.select.creating.example-db">
  61. <title>データベースアダプタの select() メソッドの例</title>
  62. <programlisting language="php"><![CDATA[
  63. $db = Zend_Db::factory( ...options... );
  64. $select = $db->select();
  65. ]]></programlisting>
  66. </example>
  67. <para>
  68. <classname>Zend_Db_Select</classname> オブジェクトを作成するもうひとつの方法は、
  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( ...options... );
  75. $select = new Zend_Db_Select($db);
  76. ]]></programlisting>
  77. </example>
  78. </sect2>
  79. <sect2 id="zend.db.select.building">
  80. <title>Select クエリの作成</title>
  81. <para>
  82. クエリを作成する際に、クエリの句を個別に追加していくことができます。
  83. <classname>Zend_Db_Select</classname> オブジェクトには、
  84. 個々の句を追加していくメソッドが用意されています。
  85. </para>
  86. <example id="zend.db.select.building.example">
  87. <title>メソッドを使用して句を追加する例</title>
  88. <programlisting language="php"><![CDATA[
  89. // Zend_Db_Select オブジェクトを作成します
  90. $select = $db->select();
  91. // FROM 句を追加します
  92. $select->from( ...テーブルとカラムを指定します... )
  93. // WHERE 句を追加します
  94. $select->where( ...検索条件を指定します... )
  95. // ORDER BY 句を追加します
  96. $select->order( ...ソート条件を指定します... );
  97. ]]></programlisting>
  98. </example>
  99. <para>
  100. <classname>Zend_Db_Select</classname> オブジェクトの大半のメソッドで、便利な
  101. 「流れるようなインターフェイス」形式を利用できます。これは、
  102. 各メソッドが、自分自身への参照を結果として返すということです。
  103. つまり、その結果を使用してすぐに別のメソッドをコールできるのです。
  104. </para>
  105. <example id="zend.db.select.building.example-fluent">
  106. <title>流れるようなインターフェイスの使用例</title>
  107. <programlisting language="php"><![CDATA[
  108. $select = $db->select()
  109. ->from( ...テーブルとカラムを指定します... )
  110. ->where( ...検索条件を指定します... )
  111. ->order( ...ソート条件を指定します... );
  112. ]]></programlisting>
  113. </example>
  114. <para>
  115. この節の例では流れるようなインターフェイスを使用しますが、
  116. この方式を使用せずに使用することも可能です。
  117. そうしなければならないこともよくあるでしょう。たとえば、
  118. クエリに句を追加する前にアプリケーションで何らかの処理が必要な場合などです。
  119. </para>
  120. <sect3 id="zend.db.select.building.from">
  121. <title>FROM 句の追加</title>
  122. <para>
  123. このクエリのテーブルを指定するために <methodname>from()</methodname>
  124. メソッドを使用します。テーブル名は、単純に文字列で指定できます。
  125. <classname>Zend_Db_Select</classname> はテーブル名を識別子としてクォートするので、
  126. 特殊文字を使用することもできます。
  127. </para>
  128. <example id="zend.db.select.building.from.example">
  129. <title>from() メソッドの例</title>
  130. <programlisting language="php"><![CDATA[
  131. // できあがるクエリは、このようになります
  132. // SELECT *
  133. // FROM "products"
  134. $select = $db->select()
  135. ->from( 'products' );
  136. ]]></programlisting>
  137. </example>
  138. <para>
  139. テーブルの相関名 (あるいは "エイリアス" とも言われます)
  140. を指定することもできます。その場合は、
  141. 単純な文字列ではなく連想配列を使用し、相関名とテーブル名の対応を指定します。
  142. <acronym>SQL</acronym> のその他の句で、この相関名を使用できるようになります。
  143. 複数のテーブルを結合したクエリを作成する場合は、
  144. <classname>Zend_Db_Select</classname> はそのテーブル名に基づいた一意な相関名を作成します。
  145. </para>
  146. <example id="zend.db.select.building.from.example-cname">
  147. <title>テーブルの相関名を指定する例</title>
  148. <programlisting language="php"><![CDATA[
  149. // できあがるクエリは、このようになります
  150. // SELECT p.*
  151. // FROM "products" AS p
  152. $select = $db->select()
  153. ->from( array('p' => 'products') );
  154. ]]></programlisting>
  155. </example>
  156. <para>
  157. <acronym>RDBMS</acronym> によっては、テーブル名の前にスキーマ名をつなげる方式をサポートしているものもあります。
  158. テーブル名として、"<code>schemaName.tableName</code>"
  159. のように指定できます。この場合、
  160. <classname>Zend_Db_Select</classname> は各部分を個別にクォートします。
  161. あるいはスキーマ名とテーブル名を別々に指定することもできます。
  162. もし両方でスキーマ名を指定した場合は、
  163. テーブル名と同時に指定したもののほうが優先されます。
  164. </para>
  165. <example id="zend.db.select.building.from.example-schema">
  166. <title>スキーマ名の指定の例</title>
  167. <programlisting language="php"><![CDATA[
  168. // できあがるクエリは、このようになります
  169. // SELECT *
  170. // FROM "myschema"."products"
  171. $select = $db->select()
  172. ->from( 'myschema.products' );
  173. // あるいは
  174. $select = $db->select()
  175. ->from('products', '*', 'myschema');
  176. ]]></programlisting>
  177. </example>
  178. </sect3>
  179. <sect3 id="zend.db.select.building.columns">
  180. <title>カラムの追加</title>
  181. <para>
  182. <methodname>from()</methodname> メソッドの二番目の引数で、
  183. 対応するテーブルから取得するカラムを指定できます。
  184. カラムを指定しなかった場合のデフォルトは
  185. "<code>*</code>" で、これは "すべてのカラム"
  186. を表す <acronym>SQL</acronym> のワイルドカードです。
  187. </para>
  188. <para>
  189. カラム名を指定するには、単純な文字列の配列を使用するか、
  190. あるいは連想配列でエイリアスとカラム名を対応させます。
  191. 取得したいカラムがひとつだけの場合でエイリアスを使用しない場合は、
  192. 配列ではなく単純な文字列で指定することもできます。
  193. </para>
  194. <para>
  195. 空の配列をカラムの引数として指定すると、
  196. 対応するテーブルからのカラムは結果セットに含まれなくなります。
  197. <methodname>join()</methodname> メソッドの
  198. <link linkend="zend.db.select.building.join.example-no-columns">コード例</link>
  199. を参照ください。
  200. </para>
  201. <para>
  202. カラム名を
  203. "<code>correlationName.columnName</code>"
  204. の形式で指定することもできます。この場合、
  205. <classname>Zend_Db_Select</classname> は各部分を個別にクォートします。
  206. カラムの correlationName (相関名) を指定しなかった場合は、
  207. 現在の <methodname>from()</methodname> メソッドで指定したテーブルの名前を使用します。
  208. </para>
  209. <example id="zend.db.select.building.columns.example">
  210. <title>カラムを指定する例</title>
  211. <programlisting language="php"><![CDATA[
  212. // できあがるクエリは、このようになります
  213. // SELECT p."product_id", p."product_name"
  214. // FROM "products" AS p
  215. $select = $db->select()
  216. ->from(array('p' => 'products'),
  217. array('product_id', 'product_name'));
  218. // 同じクエリを、相関名を指定して作成します
  219. // SELECT p."product_id", p."product_name"
  220. // FROM "products" AS p
  221. $select = $db->select()
  222. ->from(array('p' => 'products'),
  223. array('p.product_id', 'p.product_name'));
  224. // このクエリを、カラムのひとつにエイリアスを指定して作成します
  225. // SELECT p."product_id" AS prodno, p."product_name"
  226. // FROM "products" AS p
  227. $select = $db->select()
  228. ->from(array('p' => 'products'),
  229. array('prodno' => 'product_id', 'product_name'));
  230. ]]></programlisting>
  231. </example>
  232. </sect3>
  233. <sect3 id="zend.db.select.building.columns-expr">
  234. <title>式によるカラムの追加</title>
  235. <para>
  236. <acronym>SQL</acronym> クエリでは、単にテーブルのカラムを使用するだけでなく
  237. 何らかの式をカラムとして使用することもあります。
  238. このような場合は、相関名をつけたりクォートを適用したりしてはいけません。
  239. カラム文字列に括弧が含まれている場合に、<classname>Zend_Db_Select</classname>
  240. はそれを式として扱います。
  241. </para>
  242. <para>
  243. <classname>Zend_Db_Expr</classname> 型のオブジェクトを明示的に作成し、
  244. 文字列がカラム名と解釈されてしまうことを防ぐこともできます。
  245. <classname>Zend_Db_Expr</classname> は、文字列をひとつだけ含む最小限のクラスです。
  246. <classname>Zend_Db_Select</classname> は <code>Zend_Db_Expr</code> 型のオブジェクトを認識し、
  247. それを文字列に変換しますが、
  248. その際にクォートや相関名などの処理を適用しません。
  249. </para>
  250. <note>
  251. <para>
  252. カラムとして使用する式に括弧が含まれている場合は、
  253. カラム名で <classname>Zend_Db_Expr</classname> を指定する必要はありません。
  254. <classname>Zend_Db_Select</classname> は、括弧を発見すると自動的にその文字列を式として扱います。
  255. クォートや相関名の設定はされません。
  256. </para>
  257. </note>
  258. <example id="zend.db.select.building.columns-expr.example">
  259. <title>式を含むカラムの指定の例</title>
  260. <programlisting language="php"><![CDATA[
  261. // できあがるクエリは、このようになります
  262. // SELECT p."product_id", LOWER(product_name)
  263. // FROM "products" AS p
  264. // 括弧つきの式は、暗黙のうちに
  265. // Zend_Db_Expr として扱われます
  266. $select = $db->select()
  267. ->from(array('p' => 'products'),
  268. array('product_id', 'LOWER(product_name)'));
  269. // できあがるクエリは、このようになります
  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. // このクエリを、明示的に 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. 上の例では、<classname>Zend_Db_Select</classname> は
  290. 相関名の設定や識別子のクォートといった処理を行いません。
  291. あいまいさを解決するためにそのような処理が必要な場合は、
  292. 手動で文字列を変更する必要があります。
  293. </para>
  294. <para>
  295. カラム名が <acronym>SQL</acronym> キーワードや特殊文字を含んでいる場合は、
  296. アダプタの <methodname>quoteIdentifier()</methodname>
  297. メソッドを使用して結果を操作する必要があります。
  298. <methodname>quoteIdentifier()</methodname> は、
  299. 識別子に対して <acronym>SQL</acronym> のクォート処理を行います。
  300. これによりテーブルやカラムといった識別子を
  301. <acronym>SQL</acronym> のそれ以外の部分と区別できるようになります。
  302. </para>
  303. <para>
  304. クォート処理を直接文字列に埋め込んでしまわずに
  305. <methodname>quoteIdentifier()</methodname> メソッドを使用することで、
  306. あなたのコードをデータベースに依存しないものにできます。
  307. というのも、<acronym>RDBMS</acronym> によってはあまり標準的ではない文字でクォートを行うものもあるからです。
  308. <methodname>quoteIdentifier()</methodname> メソッドは、
  309. アダプタの型に応じて適切なクォート文字を使用するように設計されています。
  310. <methodname>quoteIdentifier()</methodname> メソッドはまた、
  311. 識別子の名前の中に登場するクォート文字自体もエスケープします。
  312. </para>
  313. <example id="zend.db.select.building.columns-quoteid.example">
  314. <title>式の中のカラムをクォートする例</title>
  315. <programlisting language="php"><![CDATA[
  316. // このクエリを作成する際に、式の中にある特別なカラム名 "from" をクォートします
  317. // SELECT p."from" + 10 AS origin
  318. // FROM "products" AS p
  319. $select = $db->select()
  320. ->from(array('p' => 'products'),
  321. array('origin' =>
  322. '(p.' . $db->quoteIdentifier('from') . ' + 10)')
  323. );
  324. ]]></programlisting>
  325. </example>
  326. </sect3>
  327. <sect3 id="zend.db.select.building.columns-atomic">
  328. <title>既存の FROM あるいは JOIN テーブルへのカラムの追加</title>
  329. <para>
  330. 既存の FROM や JOIN のテーブルに対して、それらのメソッドをコールした後で
  331. カラムを追加したくなることもあるかもしれません。
  332. <methodname>columns()</methodname> メソッドを使用すると、
  333. クエリを実行する前ならいつでも好きなときに特定のカラムを追加できます。
  334. カラムは、文字列あるいは <classname>Zend_Db_Expr</classname>、
  335. あるいはその配列で指定します。
  336. このメソッドの 2 番目の引数は省略可能です。
  337. 省略した場合は、FROM テーブルにカラムが追加されます。
  338. 指定する場合は、既存の相関名を使用しなければなりません。
  339. </para>
  340. <example id="zend.db.select.building.columns-atomic.example">
  341. <title>columns() メソッドでカラムを追加する例</title>
  342. <programlisting language="php"><![CDATA[
  343. // できあがるクエリは、このようになります
  344. // SELECT p."product_id", p."product_name"
  345. // FROM "products" AS p
  346. $select = $db->select()
  347. ->from(array('p' => 'products'), 'product_id')
  348. ->columns('product_name');
  349. // 同じクエリを、相関名を指定して作成します
  350. // SELECT p."product_id", p."product_name"
  351. // FROM "products" AS p
  352. $select = $db->select()
  353. ->from(array('p' => 'products'), 'p.product_id')
  354. ->columns('product_name', 'p');
  355. // あるいは columns('p.product_name')
  356. ]]></programlisting>
  357. </example>
  358. </sect3>
  359. <sect3 id="zend.db.select.building.join">
  360. <title>JOIN による、クエリへの別のテーブルの追加</title>
  361. <para>
  362. 有用なクエリの多くは、<acronym>JOIN</acronym>
  363. を使用して複数テーブルの行を結合しています。
  364. テーブルを <classname>Zend_Db_Select</classname> クエリに追加するには、
  365. <methodname>join()</methodname> メソッドを使用します。
  366. このメソッドの使用法は <methodname>from()</methodname>
  367. メソッドと似ていますが、ほとんどの場合に結合条件を指定するという点が異なります。
  368. </para>
  369. <example id="zend.db.select.building.join.example">
  370. <title>join() メソッドの例</title>
  371. <programlisting language="php"><![CDATA[
  372. // できあがるクエリは、このようになります
  373. // SELECT p."product_id", p."product_name", l.*
  374. // FROM "products" AS p JOIN "line_items" AS l
  375. // ON p.product_id = l.product_id
  376. $select = $db->select()
  377. ->from(array('p' => 'products'),
  378. array('product_id', 'product_name'))
  379. ->join(array('l' => 'line_items'),
  380. 'p.product_id = l.product_id');
  381. ]]></programlisting>
  382. </example>
  383. <para>
  384. <methodname>join()</methodname> の二番目の引数として、
  385. 結合条件を文字列で指定します。これは、
  386. あるテーブルの行が別のテーブルのどの行と対応するのかを表す条件式です。
  387. 式の中では相関名を使用できます。
  388. </para>
  389. <note>
  390. <para>
  391. 結合条件に指定した式に関しては、クォート処理は行われません。
  392. クォートする必要のあるカラム名を使用する場合は、
  393. 結合条件の文字列を作成する際に
  394. <methodname>quoteIdentifier()</methodname> を使用しなければなりません。
  395. </para>
  396. </note>
  397. <para>
  398. <methodname>join()</methodname> の三番目の引数はカラム名を表す配列です。
  399. これは <methodname>from()</methodname> メソッドで使用する形式と似ています。
  400. デフォルトは "<code>*</code>" です。
  401. 相関名や式、<classname>Zend_Db_Expr</classname> についての扱いは、
  402. <methodname>from()</methodname> メソッドにおけるカラム名の配列と同じです。
  403. </para>
  404. <para>
  405. テーブルからカラムを取得しない場合は、
  406. カラムリストに空の配列を使用します。
  407. これは <methodname>from()</methodname> メソッドでも同様に動作しますが、
  408. 普通は最初のテーブルからは何らかのカラムを取得するでしょう。
  409. 一方、連結するテーブルについてはカラムを取得しないこともありえます。
  410. </para>
  411. <example id="zend.db.select.building.join.example-no-columns">
  412. <title>カラムを指定しない例</title>
  413. <programlisting language="php"><![CDATA[
  414. // できあがるクエリは、このようになります
  415. // SELECT p."product_id", p."product_name"
  416. // FROM "products" AS p JOIN "line_items" AS l
  417. // ON p.product_id = l.product_id
  418. $select = $db->select()
  419. ->from(array('p' => 'products'),
  420. array('product_id', 'product_name'))
  421. ->join(array('l' => 'line_items'),
  422. 'p.product_id = l.product_id',
  423. array() ); // 空のカラムリスト
  424. ]]></programlisting>
  425. <para>
  426. 上の例で、連結したテーブルのカラム一覧の場所に
  427. 空の配列 <methodname>array()</methodname> を指定していることに注意しましょう。
  428. </para>
  429. </example>
  430. <para>
  431. <acronym>SQL</acronym> の結合にはいくつかの形式があります。
  432. 以下に、<classname>Zend_Db_Select</classname> がサポートする結合の形式をまとめます。
  433. </para>
  434. <itemizedlist>
  435. <listitem>
  436. <para>
  437. <methodname>join(table, join, [columns])</methodname> メソッドあるいは
  438. <methodname>joinInner(table, join, [columns])</methodname> メソッドによる
  439. <command>INNER JOIN</command>
  440. </para>
  441. <para>
  442. これはもっとも一般的な結合形式です。各テーブルの行を、
  443. 指定した結合条件に基づいて比較します。
  444. 結果セットには、その結合条件を満たす行のみが含まれます。
  445. 条件を満たす行がない場合は、結果セットが空になることもあります。
  446. </para>
  447. <para>
  448. すべての <acronym>RDBMS</acronym> が、この結合形式に対応しています。
  449. </para>
  450. </listitem>
  451. <listitem>
  452. <para>
  453. <methodname>joinLeft(table, condition, [columns])</methodname> メソッドによる
  454. <command>LEFT JOIN</command>
  455. </para>
  456. <para>
  457. 左側のテーブルのすべての行と
  458. 右側のテーブルの条件にマッチする行が含まれます。
  459. 右側のテーブルからのカラムのうち、
  460. 左側のテーブルに対応する行がないものについては
  461. NULL で埋められます。
  462. </para>
  463. <para>
  464. すべての <acronym>RDBMS</acronym> が、この結合形式に対応しています。
  465. </para>
  466. </listitem>
  467. <listitem>
  468. <para>
  469. <methodname>joinRight(table, condition, [columns])</methodname> メソッドによる
  470. <command>RIGHT JOIN</command>
  471. </para>
  472. <para>
  473. 右外部結合は、左外部結合を補完するものです。
  474. 右側のテーブルのすべての行と
  475. 左側のテーブルの条件にマッチする行が含まれます。
  476. 左側のテーブルからのカラムのうち、
  477. 右側のテーブルに対応する行がないものについては
  478. NULL で埋められます。
  479. </para>
  480. <para>
  481. <acronym>RDBMS</acronym> によっては、この結合形式に対応していないものもあります。
  482. しかし、一般に右外部結合は、
  483. テーブルの順番を入れ替えれば左外部結合として表すことが可能です。
  484. </para>
  485. </listitem>
  486. <listitem>
  487. <para>
  488. <methodname>joinFull(table, condition, [columns])</methodname> メソッドによる
  489. <command>FULL JOIN</command>
  490. </para>
  491. <para>
  492. 完全外部結合は、左外部結合と右外部結合を組み合わせたようなものです。
  493. 両側のテーブルのすべての行が含まれます。
  494. 結合条件を満たす組み合わせがあった場合はそれらが同一行にまとめられ、
  495. それ以外の場合は、対応するデータがないカラムについては NULL で埋められます。
  496. </para>
  497. <para>
  498. <acronym>RDBMS</acronym> によっては、この結合形式に対応していないものもあります。
  499. </para>
  500. </listitem>
  501. <listitem>
  502. <para>
  503. <methodname>joinCross(table, [columns])</methodname> メソッドによる
  504. <command>CROSS JOIN</command>
  505. </para>
  506. <para>
  507. クロス結合とは、デカルト積のことです。
  508. 最初のテーブルの各行に対して、
  509. 二番目のテーブルのすべての行がマッチします。
  510. つまり、結果セットの行数は、
  511. ふたつのテーブルの行数の積と等しくなります。
  512. 結果セットをフィルタリングするには、WHERE
  513. 句で条件を指定します。
  514. この方法によるクロス結合は、昔の SQL-89
  515. の結合構文と似ています。
  516. </para>
  517. <para>
  518. <methodname>joinCross()</methodname> メソッドには、
  519. 結合条件を指定するパラメータがありません。
  520. <acronym>RDBMS</acronym> によっては、この結合形式に対応していないものもあります。
  521. </para>
  522. </listitem>
  523. <listitem>
  524. <para>
  525. <methodname>joinNatural(table, [columns])</methodname> メソッドによる
  526. <command>NATURAL JOIN</command>
  527. </para>
  528. <para>
  529. 自然結合は、両方のテーブルに同じ名前で登場するカラムを比較します。
  530. 比較はすべてのカラムに対して行われます。
  531. この <acronym>API</acronym> でサポートしているのは、自然内部結合のみです。
  532. <acronym>SQL</acronym> で自然外部結合がサポートされていたとしても、使用できません。
  533. </para>
  534. <para>
  535. <methodname>joinNatural()</methodname> メソッドには、
  536. 結合条件を指定するパラメータはありません。
  537. </para>
  538. </listitem>
  539. </itemizedlist>
  540. <para>
  541. これらの結合メソッドに加え、クエリを単純にするために
  542. JoinUsing メソッドを使用できます。完全な結合条件を渡すかわりに、
  543. 単純に結合するカラム名の配列を渡してやれば
  544. <classname>Zend_Db_Select</classname> オブジェクトが結合条件を作成してくれます。
  545. </para>
  546. <example id="zend.db.select.building.joinusing.example">
  547. <title>joinUsing() メソッドの例</title>
  548. <programlisting language="php"><![CDATA[
  549. // できあがるクエリは、このようになります
  550. // SELECT *
  551. // FROM "table1"
  552. // JOIN "table2"
  553. // ON "table1".column1 = "table2".column1
  554. // WHERE column2 = 'foo'
  555. $select = $db->select()
  556. ->from('table1')
  557. ->joinUsing('table2', 'column1')
  558. ->where('column2 = ?', 'foo');]]></programlisting>
  559. </example>
  560. <para>
  561. <classname>Zend_Db_Select</classname> の結合メソッドには、
  562. それぞれ対応する 'using' メソッドがあります。
  563. </para>
  564. <itemizedlist>
  565. <listitem>
  566. <para>
  567. <methodname>joinUsing(table, join, [columns])</methodname> および
  568. <methodname>joinInnerUsing(table, join, [columns])</methodname>
  569. </para>
  570. </listitem>
  571. <listitem>
  572. <para>
  573. <methodname>joinLeftUsing(table, join, [columns])</methodname>
  574. </para>
  575. </listitem>
  576. <listitem>
  577. <para>
  578. <methodname>joinRightUsing(table, join, [columns])</methodname>
  579. </para>
  580. </listitem>
  581. <listitem>
  582. <para>
  583. <methodname>joinFullUsing(table, join, [columns])</methodname>
  584. </para>
  585. </listitem>
  586. </itemizedlist>
  587. </sect3>
  588. <sect3 id="zend.db.select.building.where">
  589. <title>WHERE 句の追加</title>
  590. <para>
  591. 結果セットの行を制限するための条件を指定するには
  592. <methodname>where()</methodname> メソッドを使用します。
  593. このメソッドの最初の引数は <acronym>SQL</acronym> の式で、これをクエリの
  594. <acronym>SQL</acronym> で <acronym>WHERE</acronym> 句として使用します。
  595. </para>
  596. <example id="zend.db.select.building.where.example">
  597. <title>where() メソッドの例</title>
  598. <programlisting language="php"><![CDATA[
  599. // できあがるクエリは、このようになります
  600. // SELECT product_id, product_name, price
  601. // FROM "products"
  602. // WHERE price > 100.00
  603. $select = $db->select()
  604. ->from('products',
  605. array('product_id', 'product_name', 'price'))
  606. ->where('price > 100.00');]]></programlisting>
  607. </example>
  608. <note>
  609. <para>
  610. <methodname>where()</methodname> メソッドや <methodname>orWhere()</methodname>
  611. メソッドで指定する式にはクォート処理は行われません。
  612. クォートする必要のあるカラム名を使用する場合は、
  613. 条件の文字列を作成する際に
  614. <methodname>quoteIdentifier()</methodname> を使用しなければなりません。
  615. </para>
  616. </note>
  617. <para>
  618. <methodname>where()</methodname> メソッドの二番目の引数はオプションです。
  619. これは式を置き換える値となります。
  620. <classname>Zend_Db_Select</classname> は値をクォートし、式の中の
  621. クエスチョンマーク ("<code>?</code>") をその値で置き換えます。
  622. </para>
  623. <para>
  624. このメソッドはパラメータをひとつだけ受け取ります。
  625. 複数の値を置換する必要がある場合は、文字列を自分でフォーマットし、
  626. 値の挿入やクォートを自分で行う必要があります。
  627. </para>
  628. <example id="zend.db.select.building.where.example-param">
  629. <title>where() メソッドでのパラメータの例</title>
  630. <programlisting language="php"><![CDATA[
  631. // できあがるクエリは、このようになります
  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. SQL の IN 演算子を使うとき、 <methodname>where()</methodname> メソッドに
  644. 第2引数として配列を渡せます。
  645. </para>
  646. <example id="zend.db.select.building.where.example-array">
  647. <title>where() メソッドでの配列パラメータ例</title>
  648. <programlisting language="php"><![CDATA[
  649. // クエリをビルド
  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. <classname>Zend_Db_Select</classname> オブジェクト上で、<methodname>where()</methodname>
  662. メソッドを複数回実行することもできます。その結果のクエリは、
  663. 指定した条件を <acronym>AND</acronym> でひとつにまとめたものとなります。
  664. </para>
  665. <example id="zend.db.select.building.where.example-and">
  666. <title>複数の where() メソッドの例</title>
  667. <programlisting language="php"><![CDATA[
  668. // できあがるクエリは、このようになります
  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. 複数の条件を <acronym>OR</acronym> で連結したい場合は、
  684. <methodname>orWhere()</methodname> メソッドを使用します。
  685. このメソッドの使用法は <methodname>where()</methodname>
  686. メソッドとほとんど同じですが、条件の前には
  687. <acronym>AND</acronym> ではなく <acronym>OR</acronym>
  688. がつくことになります。
  689. </para>
  690. <example id="zend.db.select.building.where.example-or">
  691. <title>orWhere() メソッドの例</title>
  692. <programlisting language="php"><![CDATA[
  693. // できあがるクエリは、このようになります
  694. // SELECT product_id, product_name, price
  695. // FROM "products"
  696. // WHERE (price < 100.00)
  697. // OR (price > 500.00)
  698. $minimumPrice = 100;
  699. $maximumPrice = 500;
  700. $select = $db->select()
  701. ->from('products',
  702. array('product_id', 'product_name', 'price'))
  703. ->where('price < ?', $minimumPrice)
  704. ->orWhere('price > ?', $maximumPrice);
  705. ]]></programlisting>
  706. </example>
  707. <para>
  708. <classname>Zend_Db_Select</classname> は、<methodname>where()</methodname> メソッドや
  709. <methodname>orWhere()</methodname> メソッドで指定した式の両側に
  710. 自動的に括弧をつけます。これにより、
  711. 論理演算子が予期せぬ結果を引き起こすことを防ぎます。
  712. </para>
  713. <example id="zend.db.select.building.where.example-parens">
  714. <title>論理式を括弧で囲む例</title>
  715. <programlisting language="php"><![CDATA[
  716. // できあがるクエリは、このようになります
  717. // SELECT product_id, product_name, price
  718. // FROM "products"
  719. // WHERE (price < 100.00 OR price > 500.00)
  720. // AND (product_name = 'Apple')
  721. $minimumPrice = 100;
  722. $maximumPrice = 500;
  723. $prod = 'Apple';
  724. $select = $db->select()
  725. ->from('products',
  726. array('product_id', 'product_name', 'price'))
  727. ->where("price < $minimumPrice OR price > $maximumPrice")
  728. ->where('product_name = ?', $prod);
  729. ]]></programlisting>
  730. </example>
  731. <para>
  732. 上の例では、括弧がなければ結果はまったく異なるものとなります。
  733. なぜなら、<acronym>AND</acronym> のほうが <acronym>OR</acronym>
  734. よりも優先順位が高いからです。<classname>Zend_Db_Select</classname>
  735. は括弧をつけるので、それぞれの <methodname>where()</methodname>
  736. で指定された式の結合度が <acronym>AND</acronym>
  737. より高くなります。
  738. </para>
  739. </sect3>
  740. <sect3 id="zend.db.select.building.group">
  741. <title>GROUP BY 句の追加</title>
  742. <para>
  743. <acronym>SQL</acronym> で <command>GROUP BY</command> 句を使用すると、
  744. 結果セットの行数を減らすことができます。
  745. <command>GROUP BY</command> 句で指定したカラムの一意な値ごとに、
  746. 結果が一行にまとめられます。
  747. </para>
  748. <para>
  749. <classname>Zend_Db_Select</classname> では、行のグループ化を行うためのカラムを
  750. <methodname>group()</methodname> メソッドで指定します。
  751. このメソッドへの引数は、<command>GROUP BY</command>
  752. 句で使用するカラムあるいは複数カラムの配列となります。
  753. </para>
  754. <example id="zend.db.select.building.group.example">
  755. <title>group() メソッドの例</title>
  756. <programlisting language="php"><![CDATA[
  757. // できあがるクエリは、このようになります
  758. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  759. // FROM "products" AS p JOIN "line_items" AS l
  760. // ON p.product_id = l.product_id
  761. // GROUP BY p.product_id
  762. $select = $db->select()
  763. ->from(array('p' => 'products'),
  764. array('product_id'))
  765. ->join(array('l' => 'line_items'),
  766. 'p.product_id = l.product_id',
  767. array('line_items_per_product' => 'COUNT(*)'))
  768. ->group('p.product_id');
  769. ]]></programlisting>
  770. </example>
  771. <para>
  772. <methodname>from()</methodname> メソッドでのカラムの配列と同様、
  773. カラム名には相関名を使用できます。また、
  774. カラム名は識別子としてクォートされます。
  775. ただし、文字列に括弧が含まれたり
  776. <classname>Zend_Db_Expr</classname> 型のオブジェクトを指定したりした場合は別です。
  777. </para>
  778. </sect3>
  779. <sect3 id="zend.db.select.building.having">
  780. <title>HAVING 句の追加</title>
  781. <para>
  782. <acronym>SQL</acronym> で <constant>HAVING</constant> 句を使用すると、
  783. グループ化した行に制約を適用します。これは、
  784. <constant>WHERE</constant> 句が行に対して制約を適用するのと同じです。
  785. しかし、これらには相違点があります。
  786. <constant>WHERE</constant> 条件はグループ化の前に適用されますが、
  787. <constant>HAVING</constant> 条件はグループ化された後に適用されます。
  788. </para>
  789. <para>
  790. <classname>Zend_Db_Select</classname> では、グループに対する制約を指定するには
  791. <methodname>having()</methodname> メソッドを使用します。
  792. このメソッドの使用法は <methodname>where()</methodname> メソッドと似ています。
  793. 最初の引数が <acronym>SQL</acronym> の式を含む文字列です。二番目の引数はオプションで、
  794. <acronym>SQL</acronym> 式の中のパラメータプレースホルダを置き換える値となります。
  795. <methodname>having()</methodname> を複数回実行すると、それらの条件が
  796. 論理演算子 <constant>AND</constant> で連結されます。
  797. <methodname>orHaving()</methodname> メソッドを使用した場合は、論理演算子
  798. <code>OR</code> で連結されます。
  799. </para>
  800. <example id="zend.db.select.building.having.example">
  801. <title>having() メソッドの例</title>
  802. <programlisting language="php"><![CDATA[
  803. // できあがるクエリは、このようになります
  804. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  805. // FROM "products" AS p JOIN "line_items" AS l
  806. // ON p.product_id = l.product_id
  807. // GROUP BY p.product_id
  808. // HAVING line_items_per_product > 10
  809. $select = $db->select()
  810. ->from(array('p' => 'products'),
  811. array('product_id'))
  812. ->join(array('l' => 'line_items'),
  813. 'p.product_id = l.product_id',
  814. array('line_items_per_product' => 'COUNT(*)'))
  815. ->group('p.product_id')
  816. ->having('line_items_per_product > 10');
  817. ]]></programlisting>
  818. </example>
  819. <note>
  820. <para>
  821. <methodname>having()</methodname> メソッドや <methodname>orHaving()</methodname>
  822. メソッドで指定する式にはクォート処理は行われません。
  823. クォートする必要のあるカラム名を使用する場合は、
  824. 条件の文字列を作成する際に
  825. <methodname>quoteIdentifier()</methodname> を使用しなければなりません。
  826. </para>
  827. </note>
  828. </sect3>
  829. <sect3 id="zend.db.select.building.order">
  830. <title>ORDER BY 句の追加</title>
  831. <para>
  832. <acronym>SQL</acronym> の <code>ORDER BY</code> 句では、
  833. クエリの結果セットの並べ替えの基準となるカラムや式を指定します。
  834. 複数のカラムを指定すると、最初のカラムの値が同じだった場合に
  835. 二番目のカラムを用いて並べ替えを行います。
  836. デフォルトでは、小さいほうから大きいほうに向かって並べ替えます。
  837. 逆に大きいほうから小さいほうに向かって並べ替えるには、
  838. カラムリストの中のそのカラム名の後に、キーワード
  839. <constant>DESC</constant> を指定します。
  840. </para>
  841. <para>
  842. <classname>Zend_Db_Select</classname> では、<methodname>order()</methodname> メソッドを使用して
  843. 並べ替えの基準となるカラムあるいはカラムの配列を指定します。
  844. 配列の各要素はカラム名を表す文字列です。オプションとして、
  845. スペースをはさんでキーワード
  846. <constant>ASC</constant> や <constant>DESC</constant> を続けます。
  847. </para>
  848. <para>
  849. <methodname>from()</methodname> メソッドや <methodname>group()</methodname>
  850. メソッドと同様、カラム名は識別子としてクォートされます。
  851. ただし、文字列に括弧が含まれたり
  852. <classname>Zend_Db_Expr</classname> 型のオブジェクトを指定したりした場合は別です。
  853. </para>
  854. <example id="zend.db.select.building.order.example">
  855. <title>order() メソッドの例</title>
  856. <programlisting language="php"><![CDATA[
  857. // できあがるクエリは、このようになります
  858. // SELECT p."product_id", COUNT(*) AS line_items_per_product
  859. // FROM "products" AS p JOIN "line_items" AS l
  860. // ON p.product_id = l.product_id
  861. // GROUP BY p.product_id
  862. // ORDER BY "line_items_per_product" DESC, "product_id"
  863. $select = $db->select()
  864. ->from(array('p' => 'products'),
  865. array('product_id'))
  866. ->join(array('l' => 'line_items'),
  867. 'p.product_id = l.product_id',
  868. array('line_items_per_product' => 'COUNT(*)'))
  869. ->group('p.product_id')
  870. ->order(array('line_items_per_product DESC',
  871. 'product_id'));
  872. ]]></programlisting>
  873. </example>
  874. </sect3>
  875. <sect3 id="zend.db.select.building.limit">
  876. <title>LIMIT 句の追加</title>
  877. <para>
  878. <acronym>RDBMS</acronym> によっては、<acronym>SQL</acronym> を拡張して、いわゆる
  879. <constant>LIMIT</constant> 句を使用できるようにしているものもあります。
  880. これは、結果セットの行数を、最大でも指定した数までに制限します。
  881. また、出力を始める前に読み飛ばす行数を指定することもできます。
  882. この機能を使用すると、結果セットの一部だけを取得することが簡単になります。
  883. たとえば、クエリの結果をページに分けて出力する場合などに便利です。
  884. </para>
  885. <para>
  886. <classname>Zend_Db_Select</classname> では、<methodname>limit()</methodname>
  887. メソッドを使用して結果の行数および読み飛ばしの行数を指定します。
  888. このメソッドの最初の引数は取得したい行数、
  889. そして二番目の引数は読み飛ばす行数となります。
  890. </para>
  891. <example id="zend.db.select.building.limit.example">
  892. <title>limit() メソッドの例</title>
  893. <programlisting language="php"><![CDATA[
  894. // できあがるクエリは、このようになります
  895. // SELECT p."product_id", p."product_name"
  896. // FROM "products" AS p
  897. // LIMIT 10, 20
  898. $select = $db->select()
  899. ->from(array('p' => 'products'),
  900. array('product_id', 'product_name'))
  901. ->limit(10, 20);
  902. ]]></programlisting>
  903. </example>
  904. <note>
  905. <para>
  906. <constant>LIMIT</constant> 構文は、すべての <acronym>RDBMS</acronym>
  907. でサポートされているわけではありません。<acronym>RDBMS</acronym> によっては、
  908. 似た機能を別の構文でサポートしているものもあります。
  909. 各 <classname>Zend_Db_Adapter_Abstract</classname> クラスには、
  910. その <acronym>RDBMS</acronym> に対応した適切な <acronym>SQL</acronym> を作成するメソッドが用意されています。
  911. </para>
  912. </note>
  913. <para>
  914. 一方、<methodname>limitPage()</methodname> メソッドを用いることによっても行数とオフセットを指定できます。
  915. このメソッドは、クエリの結果セット全体から特定の箇所の連続した行のみを取得するものです。
  916. つまり、結果の「ページ」を指定することで、
  917. そのページに該当する部分の結果のみを取得するというわけです。
  918. <methodname>limitPage()</methodname> メソッドの最初の引数にページ数、
  919. 2 番目の引数にページあたりの行数を指定します。
  920. どちらの引数も必須で、デフォルト値はありません。
  921. </para>
  922. <example id="zend.db.select.building.limit.example2">
  923. <title>limitPage() メソッドの例</title>
  924. <programlisting language="php"><![CDATA[
  925. // できあがるクエリは、このようになります
  926. // SELECT p."product_id", p."product_name"
  927. // FROM "products" AS p
  928. // LIMIT 10, 20
  929. $select = $db->select()
  930. ->from(array('p' => 'products'),
  931. array('product_id', 'product_name'))
  932. ->limitPage(2, 10);
  933. ]]></programlisting>
  934. </example>
  935. </sect3>
  936. <sect3 id="zend.db.select.building.distinct">
  937. <title>クエリ修飾子 DISTINCT の追加</title>
  938. <para>
  939. <methodname>distinct()</methodname> メソッドを使用すると、<acronym>SQL</acronym> クエリに
  940. <constant>DISTINCT</constant> キーワードを追加できます。
  941. </para>
  942. <example id="zend.db.select.building.distinct.example">
  943. <title>distinct() メソッドの例</title>
  944. <programlisting language="php"><![CDATA[
  945. // できあがるクエリは、このようになります
  946. // SELECT DISTINCT p."product_name"
  947. // FROM "products" AS p
  948. $select = $db->select()
  949. ->distinct()
  950. ->from(array('p' => 'products'), 'product_name');
  951. ]]></programlisting>
  952. </example>
  953. </sect3>
  954. <sect3 id="zend.db.select.building.for-update">
  955. <title>クエリ修飾子 FOR UPDATE の追加</title>
  956. <para>
  957. <methodname>forUpdate()</methodname> メソッドを使用すると、<acronym>SQL</acronym> クエリに
  958. <code>FOR UPDATE</code> 修飾子を追加できます。
  959. </para>
  960. <example id="zend.db.select.building.for-update.example">
  961. <title>forUpdate() メソッドの例</title>
  962. <programlisting language="php"><![CDATA[
  963. // できあがるクエリは、このようになります
  964. // SELECT FOR UPDATE p.*
  965. // FROM "products" AS p
  966. $select = $db->select()
  967. ->forUpdate()
  968. ->from(array('p' => 'products'));
  969. ]]></programlisting>
  970. </example>
  971. </sect3>
  972. <sect3 id="zend.db.select.building.union">
  973. <title>UNION クエリの構築</title>
  974. <para>
  975. <methodname>union()</methodname>メソッドに<classname>Zend_Db_Select</classname>の配列、
  976. または SQL クエリ文字列を渡すことによって、
  977. <classname>Zend_Db_Select</classname>で結合クエリを構築できます。
  978. どの種類の結合を実行したいか指定するために、
  979. 第2引数として、<constant>Zend_Db_Select::SQL_UNION</constant>、
  980. または<constant>Zend_Db_Select::SQL_UNION_ALL</constant>定数を渡せます。
  981. </para>
  982. <example id="zend.db.select.building.union.example">
  983. <title>union() メソッド例</title>
  984. <programlisting language="php"><![CDATA[
  985. $sql1 = $db->select();
  986. $sql2 = "SELECT ...";
  987. $select = $db->select()
  988. ->union(array($sql1, $sql2))
  989. ->order("id");
  990. ]]>
  991. </programlisting>
  992. </example>
  993. </sect3>
  994. </sect2>
  995. <sect2 id="zend.db.select.execute">
  996. <title>Select クエリの実行</title>
  997. <para>
  998. この節では、<classname>Zend_Db_Select</classname> オブジェクトが表すクエリを実行する方法を説明します。
  999. </para>
  1000. <sect3 id="zend.db.select.execute.query-adapter">
  1001. <title>Db アダプタからの Select クエリの実行</title>
  1002. <para>
  1003. <classname>Zend_Db_Select</classname> オブジェクトが表すクエリを実行するには、それを
  1004. <classname>Zend_Db_Adapter_Abstract</classname> オブジェクトの <methodname>query()</methodname>
  1005. メソッドの最初の引数として渡します。すると、
  1006. 文字列のクエリのかわりに <classname>Zend_Db_Select</classname> オブジェクトを使用するようになります。
  1007. </para>
  1008. <para>
  1009. <methodname>query()</methodname> メソッドは、アダプタの型によって
  1010. <classname>Zend_Db_Statement</classname> あるいは PDOStatement
  1011. 型のオブジェクトを返します。
  1012. </para>
  1013. <example id="zend.db.select.execute.query-adapter.example">
  1014. <title>Db アダプタの query() メソッドの使用例</title>
  1015. <programlisting language="php"><![CDATA[
  1016. $select = $db->select()
  1017. ->from('products');
  1018. $stmt = $db->query($select);
  1019. $result = $stmt->fetchAll();
  1020. ]]></programlisting>
  1021. </example>
  1022. </sect3>
  1023. <sect3 id="zend.db.select.execute.query-select">
  1024. <title>オブジェクトからの Select クエリの実行</title>
  1025. <para>
  1026. アダプタオブジェクトの <methodname>query()</methodname>
  1027. メソッドを使用する以外の方法としては、<classname>Zend_Db_Select</classname>
  1028. オブジェクトの <methodname>query()</methodname>
  1029. メソッドを使用するものがあります。
  1030. どちらのメソッドも、アダプタの型によって
  1031. <classname>Zend_Db_Statement</classname> あるいは PDOStatement
  1032. 型のオブジェクトを返します。
  1033. </para>
  1034. <example id="zend.db.select.execute.query-select.example">
  1035. <title>Select オブジェクトの query メソッドの使用例</title>
  1036. <programlisting language="php"><![CDATA[
  1037. $select = $db->select()
  1038. ->from('products');
  1039. $stmt = $select->query();
  1040. $result = $stmt->fetchAll();
  1041. ]]></programlisting>
  1042. </example>
  1043. </sect3>
  1044. <sect3 id="zend.db.select.execute.tostring">
  1045. <title>Select オブジェクトから SQL 文字列への変換</title>
  1046. <para>
  1047. <classname>Zend_Db_Select</classname> オブジェクトに対応する
  1048. <acronym>SQL</acronym> クエリ文字列にアクセスしたい場合は、
  1049. <methodname>__toString()</methodname> メソッドを使用します。
  1050. </para>
  1051. <example id="zend.db.select.execute.tostring.example">
  1052. <title>__toString() メソッドの例</title>
  1053. <programlisting language="php"><![CDATA[
  1054. $select = $db->select()
  1055. ->from('products');
  1056. $sql = $select->__toString();
  1057. echo "$sql\n";
  1058. // 出力は、次のような文字列になります
  1059. // SELECT * FROM "products"
  1060. ]]></programlisting>
  1061. </example>
  1062. </sect3>
  1063. </sect2>
  1064. <sect2 id="zend.db.select.other">
  1065. <title>その他のメソッド</title>
  1066. <para>
  1067. この節では、これまでにあげてこなかった <classname>Zend_Db_Select</classname>
  1068. クラスのメソッドである <methodname>getPart()</methodname> および
  1069. <methodname>reset()</methodname> について説明します。
  1070. </para>
  1071. <sect3 id="zend.db.select.other.get-part">
  1072. <title>Select オブジェクトの一部の取得</title>
  1073. <para>
  1074. <methodname>getPart()</methodname> メソッドは、<acronym>SQL</acronym> クエリの一部を返します。
  1075. たとえば、このメソッドを使用すると、
  1076. <constant>WHERE</constant> 句の式を表す配列や
  1077. <constant>SELECT</constant> するカラム (あるいは式) の配列、または
  1078. <constant>LIMIT</constant> 句のカウントやオフセットを取得できます。
  1079. </para>
  1080. <para>
  1081. 返り値は、<acronym>SQL</acronym> の一部を抜き取った文字列ではありません。
  1082. オブジェクトでの内部表現で、通常は値と式を含む配列となります。
  1083. クエリの各部分によって、その構造は異なります。
  1084. </para>
  1085. <para>
  1086. <methodname>getPart()</methodname> メソッドの引数はひとつで、
  1087. Select クエリのどの部分を返すのかをここで指定します。
  1088. たとえば、文字列 <code>'from'</code> を指定すると、
  1089. Select オブジェクトが <constant>FROM</constant>
  1090. 句として保持しているテーブルの情報を返します。
  1091. ここには結合している他のテーブルも含まれます。
  1092. </para>
  1093. <para>
  1094. <classname>Zend_Db_Select</classname> クラスでは、<acronym>SQL</acronym> クエリの各部分を指定するための定数を定義しています。
  1095. これらの定数、あるいはリテラル文字列のいずれかで指定できます。
  1096. </para>
  1097. <table id="zend.db.select.other.get-part.table">
  1098. <title>getPart() および reset() で使用する定数</title>
  1099. <tgroup cols="2">
  1100. <thead>
  1101. <row>
  1102. <entry>定数</entry>
  1103. <entry>文字列値</entry>
  1104. </row>
  1105. </thead>
  1106. <tbody>
  1107. <row>
  1108. <entry><constant>Zend_Db_Select::DISTINCT</constant></entry>
  1109. <entry><code>'distinct'</code></entry>
  1110. </row>
  1111. <row>
  1112. <entry><constant>Zend_Db_Select::FOR_UPDATE</constant></entry>
  1113. <entry><code>'forupdate'</code></entry>
  1114. </row>
  1115. <row>
  1116. <entry><constant>Zend_Db_Select::COLUMNS</constant></entry>
  1117. <entry><code>'columns'</code></entry>
  1118. </row>
  1119. <row>
  1120. <entry><constant>Zend_Db_Select::FROM</constant></entry>
  1121. <entry><code>'from'</code></entry>
  1122. </row>
  1123. <row>
  1124. <entry><constant>Zend_Db_Select::WHERE</constant></entry>
  1125. <entry><code>'where'</code></entry>
  1126. </row>
  1127. <row>
  1128. <entry><constant>Zend_Db_Select::GROUP</constant></entry>
  1129. <entry><code>'group'</code></entry>
  1130. </row>
  1131. <row>
  1132. <entry><constant>Zend_Db_Select::HAVING</constant></entry>
  1133. <entry><code>'having'</code></entry>
  1134. </row>
  1135. <row>
  1136. <entry><constant>Zend_Db_Select::ORDER</constant></entry>
  1137. <entry><code>'order'</code></entry>
  1138. </row>
  1139. <row>
  1140. <entry><constant>Zend_Db_Select::LIMIT_COUNT</constant></entry>
  1141. <entry><code>'limitcount'</code></entry>
  1142. </row>
  1143. <row>
  1144. <entry><constant>Zend_Db_Select::LIMIT_OFFSET</constant></entry>
  1145. <entry><code>'limitoffset'</code></entry>
  1146. </row>
  1147. </tbody>
  1148. </tgroup>
  1149. </table>
  1150. <example id="zend.db.select.other.get-part.example">
  1151. <title>getPart() メソッドの例</title>
  1152. <programlisting language="php"><![CDATA[
  1153. $select = $db->select()
  1154. ->from('products')
  1155. ->order('product_id');
  1156. // 文字列リテラルを使用して指定できます
  1157. $orderData = $select->getPart( 'order' );
  1158. // 同じことを、定数を用いて指定することもできます
  1159. $orderData = $select->getPart( Zend_Db_Select::ORDER );
  1160. // 返り値は、文字列ではなく配列となります。
  1161. // 各部分が異なる構造になっています。
  1162. print_r( $orderData );
  1163. ]]></programlisting>
  1164. </example>
  1165. </sect3>
  1166. <sect3 id="zend.db.select.other.reset">
  1167. <title>Select オブジェクトの一部のリセット</title>
  1168. <para>
  1169. <methodname>reset()</methodname> メソッドを使用すると、
  1170. <acronym>SQL</acronym> クエリの指定した部分のみを消去できます。
  1171. 引数を省略した場合は、すべての部分を消去します。
  1172. </para>
  1173. <para>
  1174. 引数はひとつで、これは省略可能です。
  1175. 消去したい <acronym>SQL</acronym> の部分を、<methodname>getPart()</methodname>
  1176. メソッドの引数と同じ文字列で指定します。
  1177. クエリの指定した部分が、デフォルトの状態に戻ります。
  1178. </para>
  1179. <para>
  1180. パラメータを省略すると、<methodname>reset()</methodname>
  1181. はクエリのすべての部分をデフォルトの状態に戻します。
  1182. これにより、<classname>Zend_Db_Select</classname> オブジェクトは初期状態と同等になります。
  1183. つまり、最初にインスタンスを作成したときと同じ状態ということです。
  1184. </para>
  1185. <example id="zend.db.select.other.reset.example">
  1186. <title>reset() メソッドの例</title>
  1187. <programlisting language="php"><![CDATA[
  1188. // できあがるクエリは、このようになります
  1189. // SELECT p.*
  1190. // FROM "products" AS p
  1191. // ORDER BY "product_name"
  1192. $select = $db->select()
  1193. ->from(array('p' => 'products')
  1194. ->order('product_name');
  1195. // 条件を変更し、別のカラムで並べ替えます
  1196. // SELECT p.*
  1197. // FROM "products" AS p
  1198. // ORDER BY "product_id"
  1199. // 再定義するため、いちどこの部分を消去します
  1200. $select->reset( Zend_Db_Select::ORDER );
  1201. // そして異なるカラムを指定します
  1202. $select->order('product_id');
  1203. // クエリ全体を消去します
  1204. $select->reset();
  1205. ]]></programlisting>
  1206. </example>
  1207. </sect3>
  1208. </sect2>
  1209. </sect1>
  1210. <!--
  1211. vim:se ts=4 sw=4 et:
  1212. -->