Zend Framework教程-Zend_Db-数据库操作3-Zend_Db_Table 、Zend_Db_Table_Row 、Zend_Db_Table_Rowset

Zend_Db_Table 

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

<?php

class 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

<?php
class Application_Model_UserTable extends Zend_Db_Table {
	protected $_name = 'user';
	protected $_primary = 'user_id';

}

通过$_name设置表名。通过$_primary设置主键。


使用方法:

/db_demos1/application/controllers/IndexController.php

<?php

class 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;
		 
    }

运行如果不出意外,会看到插入成功,返回插入数据的id。

以上就是使用Zend_Db_Table基本步骤。我们发现,一行sql语句没写,也做到了插入数据。 这就是Zend_Db_Table的作用。



继承Zend_Db_Table自定义业务逻辑


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_Db_Table的使用方法。做个总结:

1.引入Zend_Db_Table的方法

如上。

2.继承Zend_Db_Table实现自己的类

如上。

需要注意的命名空间。这里是用来默认的命名空间。如果要使用自己的,就需要自己在配置文件中设置了。具体可以参考之前的章节。

除了通过$_name设置表名。通过$_primary设置主键。手册中还提供了一种方式,设置这些可变的东西。如下:采用_setup方法

<?php
class ClassName extends Zend_Db_Table
{
    protected function _setup()
    {
        $this->_name = 'another_table_name';
        $this->_primary = 'another_column_name';
        parent::_setup();
    }
}
?>

3.插入

如上。

 

    	$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 

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;



Zend_Db_Table_Rowset



理解了Zend_Db_Table_Row,在理解Zend_Db_Table_Rowset就简单的多了。Zend_Db_Table_Rowset是结果集。由Zend_Db_Table_Row组成。

    	$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>\n";
		   $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>\n";
		}




具体更多的使用方法和额细节可以参考源码理解。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值