本文實例講述了Zend_Db_Table用法。分享給大家供大家參考,具體如下:
1. 簡介
Zend_Db_Table 是Zend Framework的表模塊.它通過zend_db_adapter連接到 數據庫,為數據庫模式檢查表對象,並對該表進行操作和查詢.
2. 開始
首先需要為抽象類zend_db_table(ares注:該類為抽象類,所以不能直接實例 化,只能先繼承該類,然後實例化子類)設定一個默認對數據庫adapter;除非你 指定其他類型數據庫adapter,否則,所有的zend_db_table類實例都會使用 默認adapter.
<?php // 建立一個 adapter require_once 'Zend/Db.php'; $params = array ( 'host' => '127.0.0.1', 'username' => 'malory', 'password' => '******', 'dbname' => 'camelot' ); $db = Zend_Db::factory('PDO_MYSQL', $params); // 為所有的Zend_Db_Table對象設定默認的adapter require_once 'Zend/Db/Table.php'; Zend_Db_Table::setDefaultAdapter($db); ?>
接下來,我們假定數據庫中存在一個名為”round_table”的表.要對該表 使用zend_db_table,只需繼承zend_db_table類創建一個名為RoundTable的 新類.然後我就可以通過該類在數據庫中的round_table表中檢查,操作數據 行並且取得數據結果.
<?php class RoundTable extends Zend_Db_Table {} $table = new RoundTable(); ?>
3. 表名和主鍵
默認情況下,zend_db_table類會將其類名當作數據庫中表名(大小寫不同 的地方需要添加"_").例如,一個名為SomeTableName的zend_db_table類在 數據庫中就對應表”some_table_name”.假如不希望將類名與數據庫表名以 這種添加下劃線的形式進行對應,可以在定義該類時對$_name進行重構.
<?php class ClassName extends Zend_Db_Table { // 默認表名為 'class_name' // 但是我們也可以對應其它表 protected $_name = 'another_table_name'; } ?>
zend_db_table類默認字段”id”為表的主鍵(該字段最好為自增的,但並不 是必須的).假如該表的主鍵並不是名為”$id”,你可以在定義表實體類時 對$_primary進行重構
<?php class ClassName extends Zend_Db_Table { // 默認主鍵為'id' // 但我們也可以設定其他列名為主鍵 protected $_primary = 'another_column_name'; } ?>
你也可以通過表實體類中_setup()方法設定這些變量;但是需要確保在修改 後再執行一次parent::_setup()方法.
<?php class ClassName extends Zend_Db_Table { protected function _setup() { $this->_name = 'another_table_name'; $this->_primary = 'another_column_name'; parent::_setup(); } } ?>
4. 插入數據
要在表中插入一行新數據,只需要將列名:數據的關聯數組作為參數,調 用insert()方法即可.
(zend framework)會自動對數據進行加引號處理, 並返回插入的最後一行的id值
(注意:這裡不同於 zend_db_adapter::insert方法,後者返回的是插入的行數).
<?php // // INSERT INTO round_table // (noble_title, first_name, favorite_color) // VALUES ("King", "Arthur", "blue") // class RoundTable extends Zend_Db_Table {} $table = new RoundTable(); $data = array( 'noble_title' => 'King', 'first_name' => 'Arthur', 'favorite_color' => 'blue', ) $id = $table->insert($data); ?>
5. 更新數據
要修改表中的任意行數據,我們可以設定一個列名:數據的關聯數組作為參數,調 用update()方法,同是通過一個where條件從句來決定需要改變的行.該方法將會 修改表中數據並返回被修改的行數.
(Zend frameword)將會自動對修改對數據進行加引號處理,但是這種檢查不包括 條件分句,所以你需要使用該表的zend_db_adapter對象完成該工作.
class RoundTable extends Zend_Db_Table {} $table = new RoundTable(); $db = $table->getAdapter(); $set = array( 'favorite_color' => 'yellow', ) $where = $db->quoteInto('first_name = ?', 'Robin'); $rows_affected = $table->update($set, $where);
6. Deleting Rows
要刪除表中的數據,我們可以調用delete()方法,同時通過一個where條件 分句來決定需要刪除的行.該方法將會返回被刪除的行數.
(zend framework)不會對條件分句進行加引號處理,所以你需要使用該表 的zend_db_adapter對象完成該工作
<?php // // DELETE FROM round_table // WHERE first_name = "Patsy" // class RoundTable extends Zend_Db_Table {} $table = new RoundTable(); $db = $table->getAdapter(); $where = $db->quoteInto('first_name = ?', 'Patsy'); $rows_affected = $table->delete($where); ?>
7. 根據主鍵查找數據
通過調用find()方法,可以使用主鍵值輕松地在表中檢索數據.假如你只想要查詢某 一條數據,該方法將回返回一個zend_db_table_row對象,而當你想要查詢多條記錄時 ,將會返回一個zend_db_table_rowset對象.
<?php class RoundTable extends Zend_Db_Table {} $table = new RoundTable(); // SELECT * FROM round_table WHERE id = "1" $row = $table->find(1); // SELECT * FROM round_table WHERE id IN("1", "2", 3") $rowset = $table->find(array(1, 2, 3)); ?>
8. 取回一條記錄
雖然通過主鍵找到相應數據行是很便利的事情,但是在更多的時候,我們是 通過其他一些非主鍵的條件來查找數據行的.zend_db_table提供了一個 fetchRow()方法可以實現這個功能.我們可以通過一個where條件語句(和一 個可選的order語句)調用fetchRow()方法,然後zend_db_tabel將會返回滿 足條件的第一行數據的zend_db_table_row對象.
注意,(zend framework) 將不會對where語句進行加引號處理,所以你需要 通過zend_db_adapter進行數據處理
<?php // // SELECT * FROM round_table // WHERE noble_title = "Sir" // AND first_name = "Robin" // ORDER BY favorite_color // class RoundTable extends Zend_Db_Table {} $table = new RoundTable(); $db = $table->getAdapter(); $where = $db->quoteInto('noble_title = ?', 'Sir') . $db->quoteInto('AND first_name = ?', 'Robin'); $order = 'favorite_color'; $row = $table->fetchRow($where, $order); ?>
9. 取回多條記錄
假如需要一次檢索多條記錄.可以使用fetchAll()方法.和使用fetchRow()方法類 似,該方法不僅僅可以設定where和order分句,也可以設定limit-count和 limit-offset值來限制返回的結果數.執行該方法後,把選擇的結果作為一個 Zend_Db_Table_Rowset對象返回.
注意,(zend framework) 將不會對where語句進行加引號處理,所以你需要 通過zend_db_adapter進行數據處理.
<?php class RoundTable extends Zend_Db_Table {} $table = new RoundTable(); $db = $table->getAdapter(); // SELECT * FROM round_table // WHERE noble_title = "Sir" // ORDER BY first_name // LIMIT 10 OFFSET 20 $where = $db->quoteInto('noble_title = ?', 'Sir'); $order = 'first_name'; $count = 10; $offset = 20; $rowset = $table->fetchAll($where, $order, $count, $offset); ?>
10. Adding Domain Logic
作為Zend Framework的表模塊,Zend_Db_Table將它自己很好的封裝到獨特的domain logic下. 例如,你可以重載insert()和update()方法,以實現在數據更改提交前的操作和驗證.
<?php class RoundTable extends Zend_Db_Table { public function insert($data) { // 添加一個時間戳 if (empty($data['created_on'])) { $data['created_on'] = time(); } return parent::insert($data); } public function update($data) { // 添加一個時間戳 if (empty($data['updated_on'])) { $data['updated_on'] = time(); } return parent::update($data); } } ?>
類似的,你也可以設定自己的find()方法,通過主鍵外的其他字段來查詢數據.
<?php class RoundTable extends Zend_Db_Table { public function findAllWithName($name) { $db = $this->getAdapter(); $where = $db->quoteInto("name = ?", $name); $order = "first_name"; return $this->fetchAll($where, $order); } } ?>
更多關於zend相關內容感興趣的讀者可查看本站專題:《Zend FrameWork框架入門教程》、《php優秀開發框架總結》、《Yii框架入門及常用技巧總結》、《ThinkPHP入門教程》、《php面向對象程序設計入門教程》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》
希望本文所述對大家基於Zend Framework框架的PHP程序設計有所幫助。