Zend_Db_Table.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. <sect1 id="zend.db.table">
  2. <title>Zend_Db_Table</title>
  3. <sect2 id="zend.db.table.简介">
  4. <title>简介</title>
  5. <para>
  6. Zend_Db_Table 是Zend Framework的表模块.它通过zend_db_adapter连接到
  7. 数据库,为数据库模式检查表对象,并对该表进行操作和查询.
  8. </para>
  9. </sect2>
  10. <sect2 id="zend.db.table.getting-started">
  11. <title>开始</title>
  12. <para>
  13. 首先需要为抽象类zend_db_table(ares注:该类为抽象类,所以不能直接实例
  14. 化,只能先继承该类,然后实例化子类)设定一个默认对数据库adapter;除非你
  15. 指定其他类型数据库adapter,否则,所有的zend_db_table类实例都会使用
  16. 默认adapter.
  17. </para>
  18. <programlisting role="php"><![CDATA[<?php
  19. // 建立一个 adapter
  20. require_once 'Zend/Db.php';
  21. $params = array (
  22. 'host' => '127.0.0.1',
  23. 'username' => 'malory',
  24. 'password' => '******',
  25. 'dbname' => 'camelot'
  26. );
  27. $db = Zend_Db::factory('PDO_MYSQL', $params);
  28. // 为所有的Zend_Db_Table对象设定默认的adapter
  29. require_once 'Zend/Db/Table.php';
  30. Zend_Db_Table::setDefaultAdapter($db);
  31. ?>]]>
  32. </programlisting>
  33. <para>
  34. 接下来,我们假定数据库中存在一个名为”round_table”的表.要对该表
  35. 使用zend_db_table,只需继承zend_db_table类创建一个名为RoundTable的
  36. 新类.然后我就可以通过该类在数据库中的round_table表中检查,操作数据
  37. 行并且取得数据结果.
  38. </para>
  39. <programlisting role="php"><![CDATA[<?php
  40. class RoundTable extends Zend_Db_Table {}
  41. $table = new RoundTable();
  42. ?>]]>
  43. </programlisting>
  44. </sect2>
  45. <sect2 id="zend.db.table.name-and-key">
  46. <title>表名和主键</title>
  47. <para>
  48. 默认情况下,zend_db_table类会将其类名当作数据库中表名(大小写不同
  49. 的地方需要添加"_").例如,一个名为SomeTableName的zend_db_table类在
  50. 数据库中就对应表”some_table_name”.假如不希望将类名与数据库表名以
  51. 这种添加下划线的形式进行对应,可以在定义该类时对$_name进行重构.
  52. </para>
  53. <programlisting role="php"><![CDATA[<?php
  54. class ClassName extends Zend_Db_Table
  55. {
  56. // 默认表名为 'class_name'
  57. // 但是我们也可以对应其它表
  58. protected $_name = 'another_table_name';
  59. }
  60. ?>]]>
  61. </programlisting>
  62. <para>
  63. zend_db_table类默认字段”id”为表的主键(该字段最好为自增的,但并不
  64. 是必须的).假如该表的主键并不是名为”$id”,你可以在定义表实体类时
  65. 对$_primary进行重构
  66. </para>
  67. <programlisting role="php"><![CDATA[<?php
  68. class ClassName extends Zend_Db_Table
  69. {
  70. // 默认主键为’id’
  71. // 但我们也可以设定其他列名为主键
  72. protected $_primary = 'another_column_name';
  73. }
  74. ?>]]>
  75. </programlisting>
  76. <para>
  77. 你也可以通过表实体类中_setup()方法设定这些变量;但是需要确保在修改
  78. 后再执行一次parent::_setup()方法.
  79. </para>
  80. <programlisting role="php"><![CDATA[<?php
  81. class ClassName extends Zend_Db_Table
  82. {
  83. protected function _setup()
  84. {
  85. $this->_name = 'another_table_name';
  86. $this->_primary = 'another_column_name';
  87. parent::_setup();
  88. }
  89. }
  90. ?>]]>
  91. </programlisting>
  92. </sect2>
  93. <sect2 id="zend.db.table.insert">
  94. <title>插入数据</title>
  95. <para>
  96. 要在表中插入一行新数据,只需要将列名:数据的关联数组作为参数,调
  97. 用insert()方法即可.(zend framework)会自动对数据进行加引号处理,
  98. 并返回插入的最后一行的id值(注意:这里不同于
  99. zend_db_adapter::insert方法,后者返回的是插入的行数).
  100. </para>
  101. <programlisting role="php"><![CDATA[<?php
  102. //
  103. // INSERT INTO round_table
  104. // (noble_title, first_name, favorite_color)
  105. // VALUES ("King", "Arthur", "blue")
  106. //
  107. class RoundTable extends Zend_Db_Table {}
  108. $table = new RoundTable();
  109. $data = array(
  110. 'noble_title' => 'King',
  111. 'first_name' => 'Arthur',
  112. 'favorite_color' => 'blue',
  113. )
  114. $id = $table->insert($data);
  115. ?>]]>
  116. </programlisting>
  117. </sect2>
  118. <sect2 id="zend.db.table.udpate">
  119. <title>更新数据</title>
  120. <para>
  121. 要修改表中的任意行数据,我们可以设定一个列名:数据的关联数组作为参数,调
  122. 用update()方法,同是通过一个where条件从句来决定需要改变的行.该方法将会
  123. 修改表中数据并返回被修改的行数.
  124. </para>
  125. <para>
  126. (Zend frameword)将会自动对修改对数据进行加引号处理,但是这种检查不包括
  127. 条件分句,所以你需要使用该表的zend_db_adapter对象完成该工作.
  128. </para>
  129. <programlisting role="php"><![CDATA[<?php
  130. //
  131. // UPDATE round_table
  132. // SET favorite_color = "yellow"
  133. // WHERE first_name = "Robin"
  134. //
  135. class RoundTable extends Zend_Db_Table {}
  136. $table = new RoundTable();
  137. $db = $table->getAdapter();
  138. $set = array(
  139. 'favorite_color' => 'yellow',
  140. )
  141. $where = $db->quoteInto('first_name = ?', 'Robin');
  142. $rows_affected = $table->update($set, $where);
  143. ?>]]>
  144. </programlisting>
  145. </sect2>
  146. <sect2 id="zend.db.table.delete">
  147. <title>Deleting Rows</title>
  148. <para>
  149. 要删除表中的数据,我们可以调用delete()方法,同时通过一个where条件
  150. 分句来决定需要删除的行.该方法将会返回被删除的行数.
  151. </para>
  152. <para>
  153. (zend framework)不会对条件分句进行加引号处理,所以你需要使用该表
  154. 的zend_db_adapter对象完成该工作.
  155. </para>
  156. <programlisting role="php"><![CDATA[<?php
  157. //
  158. // DELETE FROM round_table
  159. // WHERE first_name = "Patsy"
  160. //
  161. class RoundTable extends Zend_Db_Table {}
  162. $table = new RoundTable();
  163. $db = $table->getAdapter();
  164. $where = $db->quoteInto('first_name = ?', 'Patsy');
  165. $rows_affected = $table->delete($where);
  166. ?>]]>
  167. </programlisting>
  168. </sect2>
  169. <sect2 id="zend.db.table.findbykey">
  170. <title>根据主键查找数据</title>
  171. <para>
  172. 通过调用find()方法,可以使用主键值轻松地在表中检索数据.假如你只想要查询某
  173. 一条数据,该方法将回返回一个zend_db_table_row对象,而当你想要查询多条记录时
  174. ,将会返回一个zend_db_table_rowset对象.
  175. </para>
  176. <programlisting role="php"><![CDATA[<?php
  177. class RoundTable extends Zend_Db_Table {}
  178. $table = new RoundTable();
  179. // SELECT * FROM round_table WHERE id = "1"
  180. $row = $table->find(1);
  181. // SELECT * FROM round_table WHERE id IN("1", "2", 3")
  182. $rowset = $table->find(array(1, 2, 3));
  183. ?>]]>
  184. </programlisting>
  185. </sect2>
  186. <sect2 id="zend.db.table.fetchonerow">
  187. <title>取回一条记录</title>
  188. <para>
  189. 虽然通过主键找到相应数据行是很便利的事情,但是在更多的时候,我们是
  190. 通过其他一些非主键的条件来查找数据行的.zend_db_table提供了一个
  191. fetchRow()方法可以实现这个功能.我们可以通过一个where条件语句(和一
  192. 个可选的order语句)调用fetchRow()方法,然后zend_db_tabel将会返回满
  193. 足条件的第一行数据的zend_db_table_row对象.
  194. </para>
  195. <para>
  196. 注意,(zend framework) 将不会对where语句进行加引号处理,所以你需要
  197. 通过zend_db_adapter进行数据处理.
  198. </para>
  199. <programlisting role="php"><![CDATA[<?php
  200. //
  201. // SELECT * FROM round_table
  202. // WHERE noble_title = "Sir"
  203. // AND first_name = "Robin"
  204. // ORDER BY favorite_color
  205. //
  206. class RoundTable extends Zend_Db_Table {}
  207. $table = new RoundTable();
  208. $db = $table->getAdapter();
  209. $where = $db->quoteInto('noble_title = ?', 'Sir')
  210. . $db->quoteInto('AND first_name = ?', 'Robin');
  211. $order = 'favorite_color';
  212. $row = $table->fetchRow($where, $order);
  213. ?>]]>
  214. </programlisting>
  215. </sect2>
  216. <sect2 id="zend.db.table.fetchmultiple">
  217. <title>取回多条记录</title>
  218. <para>
  219. 假如需要一次检索多条记录.可以使用fetchAll()方法.和使用fetchRow()方法类
  220. 似,该方法不仅仅可以设定where和order分句,也可以设定limit-count和
  221. limit-offset值来限制返回的结果数.执行该方法后,把选择的结果作为一个
  222. Zend_Db_Table_Rowset对象返回.
  223. </para>
  224. <para>
  225. 注意,(zend framework) 将不会对where语句进行加引号处理,所以你需要
  226. 通过zend_db_adapter进行数据处理.
  227. </para>
  228. <programlisting role="php"><![CDATA[<?php
  229. class RoundTable extends Zend_Db_Table {}
  230. $table = new RoundTable();
  231. $db = $table->getAdapter();
  232. // SELECT * FROM round_table
  233. // WHERE noble_title = "Sir"
  234. // ORDER BY first_name
  235. // LIMIT 10 OFFSET 20
  236. $where = $db->quoteInto('noble_title = ?', 'Sir');
  237. $order = 'first_name';
  238. $count = 10;
  239. $offset = 20;
  240. $rowset = $table->fetchAll($where, $order, $count, $offset);
  241. ?>]]>
  242. </programlisting>
  243. </sect2>
  244. <sect2 id="zend.db.table.domain-logic">
  245. <title>Adding Domain Logic</title>
  246. <para>
  247. 作为Zend Framework的表模块,Zend_Db_Table将它自己很好的封装到独特的domain logic下.
  248. 例如,你可以重载insert()和update()方法,以实现在数据更改提交前的操作和验证.
  249. </para>
  250. <programlisting role="php"><![CDATA[<?php
  251. class RoundTable extends Zend_Db_Table
  252. {
  253. public function insert($data)
  254. {
  255. // 添加一个时间戳
  256. if (empty($data['created_on'])) {
  257. $data['created_on'] = time();
  258. }
  259. return parent::insert($data);
  260. }
  261. public function update($data)
  262. {
  263. // 添加一个时间戳
  264. if (empty($data['updated_on'])) {
  265. $data['updated_on'] = time();
  266. }
  267. return parent::update($data);
  268. }
  269. }
  270. ?>]]>
  271. </programlisting>
  272. <para>
  273. 类似的,你也可以设定自己的find()方法,通过主键外的其他字段来查询数据.
  274. </para>
  275. <programlisting role="php"><![CDATA[<?php
  276. class RoundTable extends Zend_Db_Table
  277. {
  278. public function findAllWithName($name)
  279. {
  280. $db = $this->getAdapter();
  281. $where = $db->quoteInto("name = ?", $name);
  282. $order = "first_name";
  283. return $this->fetchAll($where, $order);
  284. }
  285. }
  286. ?>]]>
  287. </programlisting>
  288. </sect2>
  289. </sect1>
  290. <!--
  291. vim:se ts=4 sw=4 et:
  292. -->