Zend_Db_Table.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. <sect1 id="zend.db.table">
  2. <title>Zend_Db_Table</title>
  3. <sect2 id="zend.db.table.introduction">
  4. <title>Inleiding</title>
  5. <para>
  6. Zend_Db_Table is een tabellenmodule voor het Zend Framework. Het
  7. verbindt je met een database via Zend_Db_Adapter, onderzoekt het
  8. schema van de tabel en helpt je dan in het manipuleren en
  9. opvragen van rijen uit de tabel.
  10. </para>
  11. </sect2>
  12. <sect2 id="zend.db.table.getting-started">
  13. <title>Om te beginnen</title>
  14. <para>
  15. Het eerste wat gedaan moet worden is een standaard database
  16. adapter te geven aan de abstracte Zend_Db_Table klasse; tenzij
  17. je het anders opgeeft zullen alle Zend_Db_Table instanties deze
  18. standaard adapter gebruiken.
  19. </para>
  20. <programlisting role="php"><![CDATA[<?php
  21. // een adapter opzetten
  22. require_once 'Zend/Db.php';
  23. $params = array (
  24. 'host' => '127.0.0.1',
  25. 'username' => 'malory',
  26. 'password' => '******',
  27. 'dbname' => 'camelot'
  28. );
  29. $db = Zend_Db::factory('PDO_MYSQL', $params);
  30. // zet de standaard adapter voor alle Zend_Db_Table objecten
  31. require_once 'Zend/Db/Table.php';
  32. Zend_Db_Table::setDefaultAdapter($db);
  33. ?>]]>
  34. </programlisting>
  35. <para>
  36. Laten we ons nu voorstellen dat je een tabel genaamd
  37. "round_table" hebt in je database. Om Zend_Db_Table te
  38. gebruiken met deze database moet je eenvoudigweg
  39. Zend_Db_Table uitbreiden door een nieuwe klasse "RoundTable"
  40. te maken (merk op hoe we de round_table naam "kameleren").
  41. Nu kunnen we via deze klasse rijen onderzoeken , manipuleren
  42. en resultaten opvragen van de "round_table" tabel in de database.
  43. </para>
  44. <programlisting role="php"><![CDATA[<?php
  45. class RoundTable extends Zend_Db_Table {}
  46. $table = new RoundTable();
  47. ?>]]>
  48. </programlisting>
  49. </sect2>
  50. <sect2 id="zend.db.table.name-and-key">
  51. <title>Tabelnaam en Primaire Key</title>
  52. <para>
  53. Per definitie verwacht Zend_Db_Table dat de tabelnaam in de
  54. database dezelfde is als zijn eigen klassenaam (eenmaal
  55. omgezet van camelCaps naar underscore_woorden). Aldus, een
  56. Zend_Db_Table klasse genaamd EenTabelNaam wordt naar een
  57. SQL tabel genaamd een_tabel_naam gemapt. Als je wil dat je
  58. klasse naar iets anders dan de underscore vorm van je
  59. klassenaam wordt gemapt, moet je de $_name eigenschap overschrijven
  60. wanneer je je klasse definieert.
  61. </para>
  62. <programlisting role="php"><![CDATA[<?php
  63. class ClassName extends Zend_Db_Table
  64. {
  65. // standaard tabelnaam is 'class_name'
  66. // maar we willen ergens anders naartoe mappen
  67. protected $_name = 'another_table_name';
  68. }
  69. ?>]]>
  70. </programlisting>
  71. <para>
  72. Per definitie verwacht Zend_Db_Table dat jouw tabel een primaire
  73. key heeft die 'id' noemt. (Het is beter indien deze kolom automatisch
  74. wordt geïncrementeerd, maar het is niet verplicht.) Indien jouw
  75. primaire key anders heet kan je de $_primary eigenschap van de klasse
  76. overschrijven wanneer je je klasse definieert.
  77. </para>
  78. <programlisting role="php"><![CDATA[<?php
  79. class ClassName extends Zend_Db_Table
  80. {
  81. // standaard primaire key is 'id'
  82. // maar we willen iets anders gebruiken
  83. protected $_primary = 'another_column_name';
  84. }
  85. ?>]]>
  86. </programlisting>
  87. <para>
  88. Op een andere manier mag je hetzelfde doen in de _setup()
  89. methode van je uitgebreide klasse; maar wees er zeker van
  90. de parent::_setup() methode op te roepen wanneer je klaar
  91. bent.
  92. </para>
  93. <programlisting role="php"><![CDATA[<?php
  94. class ClassName extends Zend_Db_Table
  95. {
  96. protected function _setup()
  97. {
  98. $this->_name = 'another_table_name';
  99. $this->_primary = 'another_column_name';
  100. parent::_setup();
  101. }
  102. }
  103. ?>]]>
  104. </programlisting>
  105. </sect2>
  106. <sect2 id="zend.db.table.insert">
  107. <title>Rijen invoegen</title>
  108. <para>
  109. Om een nieuwe rij in jouw tabel in te voegen roep je gewoon
  110. insert() op met een associatieve array van kolom:waarde data.
  111. De data zal automatisch correct worden omwikkeld met quotes,
  112. en de laatst ingevoegde ID wordt teruggestuurd. (Merk op dat
  113. dit verschilt van Zend_Db_Adapter::insert(), waar het aantal
  114. beïnvloede rijen wordt teruggestuurd.)
  115. </para>
  116. <programlisting role="php"><![CDATA[<?php
  117. //
  118. // INSERT INTO round_table
  119. // (noble_title, first_name, favorite_color)
  120. // VALUES ("King", "Arthur", "blue")
  121. //
  122. class RoundTable extends Zend_Db_Table {}
  123. $table = new RoundTable();
  124. $data = array(
  125. 'noble_title' => 'King',
  126. 'first_name' => 'Arthur',
  127. 'favorite_color' => 'blue',
  128. )
  129. $id = $table->insert($data);
  130. ?>]]>
  131. </programlisting>
  132. </sect2>
  133. <sect2 id="zend.db.table.udpate">
  134. <title>Rijen updaten</title>
  135. <para>
  136. Om eender welk aantal rijen in je tabel te updaten roep je
  137. update() op met een associatieve array van kolom:waarde data
  138. die moet worden gezet, samen met een WHERE clausule om de
  139. rijen die moeten worden geupdate te definiëren. Het zal de tabel
  140. updaten en het aantal beïnvloede rijen teruggeven.
  141. </para>
  142. <para>
  143. De data die gezet moet worden zal automatisch correct worden
  144. omwikkeld met quotes, maar de WHERE clausule niet, die moet je
  145. dus zelf quoten met het Zend_Db_Adapter object van de tabel.
  146. </para>
  147. <programlisting role="php"><![CDATA[<?php
  148. //
  149. // UPDATE round_table
  150. // SET favorite_color = "yellow"
  151. // WHERE first_name = "Robin"
  152. //
  153. class RoundTable extends Zend_Db_Table {}
  154. $table = new RoundTable();
  155. $db = $table->getAdapter();
  156. $set = array(
  157. 'favorite_color' => 'yellow',
  158. )
  159. $where = $db->quoteInto('first_name = ?', 'Robin');
  160. $rows_affected = $table->update($set, $where);
  161. ?>]]>
  162. </programlisting>
  163. </sect2>
  164. <sect2 id="zend.db.table.delete">
  165. <title>Rijen verwijderen</title>
  166. <para>
  167. Om eender welk aantal rijen te verwijderen uit een tabel
  168. roep je delete() op met een WHERE clausule om de rijen
  169. die verwijderd moeten worden te identificeren. Het zal het
  170. aantal verwijderde rijen terugsturen.
  171. </para>
  172. <para>
  173. De WHERE clausule zal niet in quotes worden omwikkeld, dus
  174. die moet je zelf quoten met het Zend_Db_Adapter object van
  175. de tabel.
  176. </para>
  177. <programlisting role="php"><![CDATA[<?php
  178. //
  179. // DELETE FROM round_table
  180. // WHERE first_name = "Patsy"
  181. //
  182. class RoundTable extends Zend_Db_Table {}
  183. $table = new RoundTable();
  184. $db = $table->getAdapter();
  185. $where = $db->quoteInto('first_name = ?', 'Patsy');
  186. $rows_affected = $table->delete($where);
  187. ?>]]>
  188. </programlisting>
  189. </sect2>
  190. <sect2 id="zend.db.table.findbykey">
  191. <title>Rijen vinden per primaire key</title>
  192. <para>
  193. Het is eenvoudig om rijen uit een tabel te verkrijgen door
  194. gebruik te maken van de primaire key waarden in de find()
  195. methode. Deze methode keert een Zend_Db_Table_Row object
  196. terug indien je één enkele key probeert te vinden, of een
  197. Zend_Db_Table_Rowset objekt indien je meerdere keys probeert
  198. te vinden met find().
  199. </para>
  200. <programlisting role="php"><![CDATA[<?php
  201. class RoundTable extends Zend_Db_Table {}
  202. $table = new RoundTable();
  203. // SELECT * FROM round_table WHERE id = "1"
  204. $row = $table->find(1);
  205. // SELECT * FROM round_table WHERE id IN("1", "2", 3")
  206. $rowset = $table->find(array(1, 2, 3));
  207. ?>]]>
  208. </programlisting>
  209. </sect2>
  210. <sect2 id="zend.db.table.fetchonerow">
  211. <title>Eén enkele rij ophalen</title>
  212. <para>
  213. Hoewel je gemakkellijk een rij kan vinden via zijn primaire key met
  214. find(), zal je vaak verschillende voorwaarden willen toevoegen om een
  215. rij te verkrijgen. Juist hiervoor verstrekt Zend_Db_Table fetchRow().
  216. Gebruik fetchRow() met een WHERE clausule (en een optionele ORDER
  217. clausule), en Zend_Db_Table zal een Zend_Db_Row object teruggeven met
  218. de eerste rij die aan de voorwaarden voldoet.
  219. </para>
  220. <para>
  221. De WHERE clausule zal niet in quotes worden omwikkeld, dus
  222. die moet je zelf quoten met het Zend_Db_Adapter object van
  223. de tabel.
  224. </para>
  225. <programlisting role="php"><![CDATA[<?php
  226. //
  227. // SELECT * FROM round_table
  228. // WHERE noble_title = "Sir"
  229. // AND first_name = "Robin"
  230. // ORDER BY favorite_color
  231. //
  232. class RoundTable extends Zend_Db_Table {}
  233. $table = new RoundTable();
  234. $db = $table->getAdapter();
  235. $where = $db->quoteInto('noble_title = ?', 'Sir')
  236. . $db->quoteInto('AND first_name = ?', 'Robin');
  237. $order = 'favorite_color';
  238. $row = $table->fetchRow($where, $order);
  239. ?>]]>
  240. </programlisting>
  241. </sect2>
  242. <sect2 id="zend.db.table.fetchmultiple">
  243. <title>Meerdere rijen ophalen</title>
  244. <para>
  245. Indien je meerdere rijen in een enkele keer moet ophalen kan
  246. je fetchAll() gebruiken. Zoals met fetchRow() behandelt deze
  247. methode WHERE en ORDER clausules, maar kan bovendien
  248. limit-count en limit-offset waarden aanvaarden om het aantal
  249. teruggekeerde rijen te beperken. Het zal een Zend_Db_Table_Rowset
  250. object teruggeven met de geselecteerde records.
  251. </para>
  252. <para>
  253. De WHERE clausule zal niet in quotes worden omwikkeld, dus
  254. die moet je zelf quoten met het Zend_Db_Adapter object van
  255. de tabel.
  256. </para>
  257. <programlisting role="php"><![CDATA[<?php
  258. class RoundTable extends Zend_Db_Table {}
  259. $table = new RoundTable();
  260. $db = $table->getAdapter();
  261. // SELECT * FROM round_table
  262. // WHERE noble_title = "Sir"
  263. // ORDER BY first_name
  264. // LIMIT 10 OFFSET 20
  265. $where = $db->quoteInto('noble_title = ?', 'Sir');
  266. $order = 'first_name';
  267. $count = 10;
  268. $offset = 20;
  269. $rowset = $table->fetchRow($where, $order, $count, $offset);
  270. ?>]]>
  271. </programlisting>
  272. </sect2>
  273. <sect2 id="zend.db.table.domain-logic">
  274. <title>Domein Logica Invoegen</title>
  275. <para>
  276. Als een tabelmodule leent Zend_Db_Table er zichzelf goed toe om
  277. je eigen domeinlogica in te kapselen. Bijvoorbeeld, je kan de
  278. insert() en update() methodes overschrijven om de gepostte data
  279. te manipuleren of te valideren voordat die naar de database wordt
  280. geschreven.
  281. </para>
  282. <programlisting role="php"><![CDATA[<?php
  283. class RoundTable extends Zend_Db_Table
  284. {
  285. public function insert($data)
  286. {
  287. // voeg een timestamp in
  288. if (empty($data['created_on'])) {
  289. $data['created_on'] = time();
  290. }
  291. return parent::insert($data);
  292. }
  293. public function update($data)
  294. {
  295. // voeg een timestamp in
  296. if (empty($data['updated_on'])) {
  297. $data['updated_on'] = time();
  298. }
  299. return parent::update($data);
  300. }
  301. }
  302. ?>]]>
  303. </programlisting>
  304. <para>
  305. Op een gelijkaardige wijze kan je je eigen find() methoden
  306. toevoegen om records op te zoeken door iets anders dan hun
  307. primaire key te gebruiken.
  308. </para>
  309. <programlisting role="php"><![CDATA[<?php
  310. class RoundTable extends Zend_Db_Table
  311. {
  312. public function findAllWithName($name)
  313. {
  314. $db = $this->getAdapter();
  315. $where = $db->quoteInto("name = ?", $name);
  316. $order = "first_name";
  317. return $this->fetchAll($where, $order);
  318. }
  319. }
  320. ?>]]>
  321. </programlisting>
  322. </sect2>
  323. </sect1>
  324. <!--
  325. vim:se ts=4 sw=4 et:
  326. -->