[ZF-10089] Zend_Log
[zend.git] / documentation / manual / zh / module_specs / Zend_Db_Table.xml
blobeedf22b11fbe100e1bbc61c0eb6b51b713f642a5
1 <sect1 id="zend.db.table">
3     <title>Zend_Db_Table</title>
5     <sect2 id="zend.db.table.简介">
7         <title>简介</title>
9         <para>
10             Zend_Db_Table 是Zend Framework的表模块.它通过zend_db_adapter连接到
11             数据库,为数据库模式检查表对象,并对该表进行操作和查询.
12         </para>
14     </sect2>
16     <sect2 id="zend.db.table.getting-started">
18         <title>开始</title>
20         <para>
21             首先需要为抽象类zend_db_table(ares注:该类为抽象类,所以不能直接实例
22             化,只能先继承该类,然后实例化子类)设定一个默认对数据库adapter;除非你
23             指定其他类型数据库adapter,否则,所有的zend_db_table类实例都会使用
24             默认adapter.
25         </para>
27         <programlisting role="php"><![CDATA[<?php
28 // 建立一个 adapter
29 require_once 'Zend/Db.php';
30 $params = array (
31     'host'     => '127.0.0.1',
32     'username' => 'malory',
33     'password' => '******',
34     'dbname'   => 'camelot'
37 $db = Zend_Db::factory('PDO_MYSQL', $params);
39 // 为所有的Zend_Db_Table对象设定默认的adapter
40 require_once 'Zend/Db/Table.php';
41 Zend_Db_Table::setDefaultAdapter($db);
42 ?>]]>
43         </programlisting>
45         <para>
46             接下来,我们假定数据库中存在一个名为”round_table”的表.要对该表
47             使用zend_db_table,只需继承zend_db_table类创建一个名为RoundTable的
48             新类.然后我就可以通过该类在数据库中的round_table表中检查,操作数据
49             行并且取得数据结果.
50         </para>
52         <programlisting role="php"><![CDATA[<?php
53 class RoundTable extends Zend_Db_Table {}
54 $table = new RoundTable();
55 ?>]]>
56         </programlisting>
58     </sect2>
60     <sect2 id="zend.db.table.name-and-key">
62         <title>表名和主键</title>
64         <para>
65             默认情况下,zend_db_table类会将其类名当作数据库中表名(大小写不同
66             的地方需要添加"_").例如,一个名为SomeTableName的zend_db_table类在
67             数据库中就对应表”some_table_name”.假如不希望将类名与数据库表名以
68             这种添加下划线的形式进行对应,可以在定义该类时对$_name进行重构.
69         </para>
71         <programlisting role="php"><![CDATA[<?php
72 class ClassName extends Zend_Db_Table
74     // 默认表名为 'class_name'
75     // 但是我们也可以对应其它表
76     protected $_name = 'another_table_name';
78 ?>]]>
79         </programlisting>
81         <para>
82             zend_db_table类默认字段”id”为表的主键(该字段最好为自增的,但并不
83             是必须的).假如该表的主键并不是名为”$id”,你可以在定义表实体类时
84             对$_primary进行重构
85         </para>
87         <programlisting role="php"><![CDATA[<?php
88 class ClassName extends Zend_Db_Table
90     // 默认主键为’id’
91     // 但我们也可以设定其他列名为主键
92     protected $_primary = 'another_column_name';
94 ?>]]>
95         </programlisting>
97         <para>
98             你也可以通过表实体类中_setup()方法设定这些变量;但是需要确保在修改
99             后再执行一次parent::_setup()方法.
100         </para>
102         <programlisting role="php"><![CDATA[<?php
103 class ClassName extends Zend_Db_Table
105     protected function _setup()
106     {
107         $this->_name = 'another_table_name';
108         $this->_primary = 'another_column_name';
109         parent::_setup();
110     }
112 ?>]]>
113         </programlisting>
115     </sect2>
117     <sect2 id="zend.db.table.insert">
119         <title>插入数据</title>
121         <para>
122             要在表中插入一行新数据,只需要将列名:数据的关联数组作为参数,调
123             用insert()方法即可.(zend framework)会自动对数据进行加引号处理,
124             并返回插入的最后一行的id值(注意:这里不同于
125             zend_db_adapter::insert方法,后者返回的是插入的行数).
126         </para>
128         <programlisting role="php"><![CDATA[<?php
130 // INSERT INTO round_table
131 //     (noble_title, first_name, favorite_color)
132 //     VALUES ("King", "Arthur", "blue")
135 class RoundTable extends Zend_Db_Table {}
137 $table = new RoundTable();
139 $data = array(
140     'noble_title' => 'King',
141     'first_name'  => 'Arthur',
142     'favorite_color' => 'blue',
145 $id = $table->insert($data);
146 ?>]]>
147         </programlisting>
149     </sect2>
151     <sect2 id="zend.db.table.udpate">
153         <title>更新数据</title>
155         <para>
156             要修改表中的任意行数据,我们可以设定一个列名:数据的关联数组作为参数,调
157             用update()方法,同是通过一个where条件从句来决定需要改变的行.该方法将会
158             修改表中数据并返回被修改的行数.
159         </para>
161         <para>
162             (Zend frameword)将会自动对修改对数据进行加引号处理,但是这种检查不包括
163             条件分句,所以你需要使用该表的zend_db_adapter对象完成该工作.
164         </para>
166         <programlisting role="php"><![CDATA[<?php
168 // UPDATE round_table
169 //     SET favorite_color = "yellow"
170 //     WHERE first_name = "Robin"
173 class RoundTable extends Zend_Db_Table {}
175 $table = new RoundTable();
176 $db = $table->getAdapter();
178 $set = array(
179     'favorite_color' => 'yellow',
182 $where = $db->quoteInto('first_name = ?', 'Robin');
184 $rows_affected = $table->update($set, $where);
185 ?>]]>
186         </programlisting>
188     </sect2>
190     <sect2 id="zend.db.table.delete">
192         <title>Deleting Rows</title>
194         <para>
195             要删除表中的数据,我们可以调用delete()方法,同时通过一个where条件
196             分句来决定需要删除的行.该方法将会返回被删除的行数.
197         </para>
199         <para>
200            (zend framework)不会对条件分句进行加引号处理,所以你需要使用该表
201            的zend_db_adapter对象完成该工作.
202         </para>
204         <programlisting role="php"><![CDATA[<?php
206 // DELETE FROM round_table
207 //     WHERE first_name = "Patsy"
210 class RoundTable extends Zend_Db_Table {}
212 $table = new RoundTable();
213 $db = $table->getAdapter();
215 $where = $db->quoteInto('first_name = ?', 'Patsy');
217 $rows_affected = $table->delete($where);
218 ?>]]>
219         </programlisting>
221     </sect2>
223     <sect2 id="zend.db.table.findbykey">
225         <title>根据主键查找数据</title>
227         <para>
228             通过调用find()方法,可以使用主键值轻松地在表中检索数据.假如你只想要查询某
229             一条数据,该方法将回返回一个zend_db_table_row对象,而当你想要查询多条记录时
230             ,将会返回一个zend_db_table_rowset对象.
231         </para>
232         <programlisting role="php"><![CDATA[<?php
233 class RoundTable extends Zend_Db_Table {}
235 $table = new RoundTable();
237 // SELECT * FROM round_table WHERE id = "1"
238 $row = $table->find(1);
240 // SELECT * FROM round_table WHERE id IN("1", "2", 3")
241 $rowset = $table->find(array(1, 2, 3));
242 ?>]]>
243         </programlisting>
245     </sect2>
247     <sect2 id="zend.db.table.fetchonerow">
249         <title>取回一条记录</title>
251         <para>
252             虽然通过主键找到相应数据行是很便利的事情,但是在更多的时候,我们是
253             通过其他一些非主键的条件来查找数据行的.zend_db_table提供了一个
254             fetchRow()方法可以实现这个功能.我们可以通过一个where条件语句(和一
255             个可选的order语句)调用fetchRow()方法,然后zend_db_tabel将会返回满
256             足条件的第一行数据的zend_db_table_row对象.
257         </para>
259         <para>
260             注意,(zend framework) 将不会对where语句进行加引号处理,所以你需要
261             通过zend_db_adapter进行数据处理.
262         </para>
264         <programlisting role="php"><![CDATA[<?php
266 // SELECT * FROM round_table
267 //     WHERE noble_title = "Sir"
268 //     AND first_name = "Robin"
269 //     ORDER BY favorite_color
272 class RoundTable extends Zend_Db_Table {}
274 $table = new RoundTable();
275 $db = $table->getAdapter();
277 $where = $db->quoteInto('noble_title = ?', 'Sir')
278        . $db->quoteInto('AND first_name = ?', 'Robin');
280 $order = 'favorite_color';
282 $row = $table->fetchRow($where, $order);
283 ?>]]>
284         </programlisting>
286     </sect2>
288     <sect2 id="zend.db.table.fetchmultiple">
290         <title>取回多条记录</title>
292         <para>
293             假如需要一次检索多条记录.可以使用fetchAll()方法.和使用fetchRow()方法类
294             似,该方法不仅仅可以设定where和order分句,也可以设定limit-count和
295             limit-offset值来限制返回的结果数.执行该方法后,把选择的结果作为一个
296             Zend_Db_Table_Rowset对象返回.
297         </para>
299         <para>
300             注意,(zend framework) 将不会对where语句进行加引号处理,所以你需要
301             通过zend_db_adapter进行数据处理.
302         </para>
304         <programlisting role="php"><![CDATA[<?php
305 class RoundTable extends Zend_Db_Table {}
307 $table = new RoundTable();
308 $db = $table->getAdapter();
310 // SELECT * FROM round_table
311 //     WHERE noble_title = "Sir"
312 //     ORDER BY first_name
313 //     LIMIT 10 OFFSET 20
315 $where = $db->quoteInto('noble_title = ?', 'Sir');
316 $order = 'first_name';
317 $count = 10;
318 $offset = 20;
320 $rowset = $table->fetchAll($where, $order, $count, $offset);
321 ?>]]>
322         </programlisting>
324     </sect2>
326     <sect2 id="zend.db.table.domain-logic">
328         <title>Adding Domain Logic</title>
330         <para>
331             作为Zend Framework的表模块,Zend_Db_Table将它自己很好的封装到独特的domain logic下.
332             例如,你可以重载insert()和update()方法,以实现在数据更改提交前的操作和验证.
334         </para>
336         <programlisting role="php"><![CDATA[<?php
337 class RoundTable extends Zend_Db_Table
339     public function insert($data)
340     {
341         // 添加一个时间戳
342         if (empty($data['created_on'])) {
343             $data['created_on'] = time();
344         }
345         return parent::insert($data);
346     }
348     public function update($data)
349     {
350         // 添加一个时间戳
351         if (empty($data['updated_on'])) {
352             $data['updated_on'] = time();
353         }
354         return parent::update($data);
355     }
357 ?>]]>
358         </programlisting>
360         <para>
361             类似的,你也可以设定自己的find()方法,通过主键外的其他字段来查询数据.
362         </para>
364         <programlisting role="php"><![CDATA[<?php
365 class RoundTable extends Zend_Db_Table
367     public function findAllWithName($name)
368     {
369         $db = $this->getAdapter();
370         $where = $db->quoteInto("name = ?", $name);
371         $order = "first_name";
372         return $this->fetchAll($where, $order);
373     }
375 ?>]]>
376         </programlisting>
378     </sect2>
380 </sect1>
381 <!--
382 vim:se ts=4 sw=4 et: