Zend_Db_Table集成了Zend_Db_Table_Abstract抽象基類。實現了對數據表操作的相關方法。要使用Zend_Db_Table。需要將Zend_Db_Table設置為默認的適配器。
項目一/db_demos1為例。用zend studio創建默認的應用項目即可
數據庫為test。表為user表。大概如下:
CREATE TABLE `user` ( `user_id` INT(10) NOT NULL AUTO_INCREMENT, `user_name` VARCHAR(50) NULL DEFAULT NULL , `user_password` CHAR(32) NULL DEFAULT NULL , `user_email` VARCHAR(50) NULL DEFAULT NULL , `user_gender` VARCHAR(1) NULL DEFAULT NULL , `user_description` VARCHAR(255) NULL DEFAULT NULL , PRIMARY KEY (`user_id`), UNIQUE INDEX `user_name` (`user_name`))COMMENT='user'COLLATE='utf8_general_ci'ENGINE=InnoDB
/db_demos1/application/Bootstrap.php
在Booststrap文件新增如下內容:作用是初始化數據庫和引入Zend_Db_Table
<?phpclass Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initdb() { require_once 'Zend/Db.php'; $params = array ( 'host' => '127.0.0.1', 'username' => 'root', 'password' => '', 'dbname' => 'test' ); $db = Zend_Db::factory ( 'PDO_MYSQL', $params ); // 為所有的Zend_Db_Table對象設定默認的adapter require_once 'Zend/Db/Table.php'; Zend_Db_Table::setDefaultAdapter ( $db ); }}
通過集成Zend_Db_Table創建UserTable類。完成對數據表user的“”映射“。內容如下:
/db_demos1/application/models/UserTable.php
<?phpclass Application_Model_UserTable extends Zend_Db_Table { protected $_name = 'user'; protected $_primary = 'user_id';}
使用方法:
/db_demos1/application/controllers/IndexController.php
<?phpclass IndexController extends Zend_Controller_Action{ public function init() { /* Initialize action controller here */ } public function indexAction() { $table = new Application_Model_UserTable(); $data = array( 'user_name' => 'zhangsan', 'user_password' => '123456', 'user_email' => 'zhangsan@a.com', 'user_gender' => '1', 'user_description' => 'description ', ); $id = $table->insert($data); var_dump($id); exit; }
以上就是使用Zend_Db_Table基本步驟。我們發現,一行sql語句沒寫,也做到了插入數據。 這就是Zend_Db_Table的作用。
Zend_Db_Table將它自己很好的封裝到獨特的domain logic下. 例如,你可以重載insert()和update()方法,以實現在數據更改提交前的操作和驗證. <?phpclass 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()方法,通過主鍵外的其他字段來查詢數據. <?phpclass 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_Db_Table的使用方法。做個總結:
1.引入Zend_Db_Table的方法
如上。
2.繼承Zend_Db_Table實現自己的類
如上。
需要注意的命名空間。這里是用來默認的命名空間。如果要使用自己的,就需要自己在配置文件中設置了。具體可以參考之前的章節。
除了通過$_name設置表名。通過$_primary設置主鍵。手冊中還提供了一種方式,設置這些可變的東西。如下:采用_setup方法
<?phpclass ClassName extends Zend_Db_Table{ protected function _setup() { $this->_name = 'another_table_name'; $this->_primary = 'another_column_name'; parent::_setup(); }}?>
如上。
$data = array( 'user_name' => 'zhangsan', 'user_password' => '123456', 'user_email' => 'zhangsan@a.com', 'user_gender' => '1', 'user_description' => 'description ', ); $id = $table->insert($data); var_dump($id);
4.更新
$set = array( 'user_name' => 'zhangsan_new_name', ); $db = $table->getAdapter(); $where = $db->quoteInto('user_id = ?', '7'); $rows_affected = $table->update($set, $where); var_dump($rows_affected) ;
5.刪除
$db = $table->getAdapter(); $where = $db->quoteInto('user_id = ?', '1'); $rows_affected = $table->delete($where); var_dump($rows_affected) ;
6.查找
1)主鍵
// SELECT * FROM user WHERE user_id = "2" $row = $table->find(2); var_dump($row); // SELECT * FROM user WHERE user_id IN("2", "3", "4") $rowset = $table->find(array(2, 3, 4)); var_dump($rowset);
2) 獲取指定條件的一行數據
$db = $table->getAdapter(); $where = $db->quoteInto('user_name = ?', 'user1'). $db->quoteInto('AND user_gender = ?', '1'); $order = 'user_name'; $row = $table->fetchRow($where, $order); var_dump($row);
3)獲取多行數據
$db = $table->getAdapter(); // SELECT * FROM user // WHERE user_name = "user" // ORDER BY user_name // LIMIT 10 OFFSET 20 $where = $db->quoteInto('user_name = ?', 'user'); $order = 'user_name'; $count = 10; $offset = 20; $rowset = $table->fetchAll($where, $order, $count, $offset); var_dump($rowset);
查詢返回的結果集是Zend_Db_Table_Row或者Zend_Db_Table_RowSet
該通過什么方式來獲取我們想要的數據呢。繼續下面的說明
Zend_Db_Table_Row對象要來保存sql操作返回的結果集的一行。通過Zend_Db_Table_Row保存的屬性可以認為和數據表或者和sql語句的字段是一一對應的。不宜可以通過對應的字段獲取指定值。你也可以修改記錄的值然后,調用save()方法可以將更改保存到數據表中.
具體操作如下:
以上述的例子
$table = new Application_Model_UserTable(); $db = $table->getAdapter(); $where = $db->quoteInto('user_id = ?', '3'); $order = 'user_name'; $row = $table->fetchRow($where, $order); //獲取數據 var_dump('user_name:'.$row->user_name); var_dump('user_description:'.$row->user_description); echo '<br/>'; //修改后 $row->user_name = 'modify your name'; $row->user_description='nothing'; $row->save(); $where = $db->quoteInto('user_id = ?', '3'); $order = 'user_name'; $row = $table->fetchRow($where, $order); var_dump('user_name:'.$row->user_name); var_dump('user_description:'.$row->user_description); exit;
$table = new Application_Model_UserTable(); //SELECT * FROM user WHERE user_id IN("2", "3", "4") $rowset = $table->find(array(2, 3, 4)); // 顯示所有的記錄 foreach ($rowset as $row) { echo "<p>" . htmlspecialchars($row->user_name) . ":" . htmlspecialchars($row->user_description) . " </p>"; $row->user_description = 'test'.mktime(); $row->save(); } $rowset = $table->find(array(2, 3, 4)); // 顯示所有的記錄 foreach ($rowset as $row) { echo "<p>" . htmlspecialchars($row->user_name) . ":" . htmlspecialchars($row->user_description) . " </p>"; }