Zend_Db_Table 实现选择特定字段(改良)
在《Zend_Db_Table 实现选择特定字段》中,通过Zend_Db_Table返回的Zend_Db_Select和自身的_fetch方法,实现了选择特定字段的目的。
很遗憾的是,这种方式返回的是数组。所以,在VIEW里,不能通过OOP方式进行操作。如何像fetchAll和fetRow那样,返回一个Zend_Db_Row对象呢?
同样的,打开源码,在里面找方法。第一想法,因为Zend_Db_Row有toArray()方法,将Zend_Db_Row转换为数组,所以它应该提供一种类似的方法,将数组转换成Zend_Db_Row。事实上,的确有:setFromArray。
兴冲冲地把listNews()返回的数组往Zend_Db_Row::setFromArray()里一扔,竟然抛出异常:
程序代码
function indexAction()
{
$new = new News();
$row = new Zend_Db_Row();
$this->view->news = $row->setFromArray($news->listNews());
}
仔细一想,listNews(),即_fetch方法返回的应该是二维数组,形如array(array('title'=>'Title', 'hit'=>0), array('title'=>'Title1', 'hit'=>2))、而setFromArray能接受的是类似array('title'=>'Title', 'hit'=>0)的一维数组。
其实,fetchAll()可以直接接受Zend_Db_Select作为参数,问题迎刃而解!
程序代码
IndexController.php:
程序代码
index.phtml:
程序代码
很遗憾的是,这种方式返回的是数组。所以,在VIEW里,不能通过OOP方式进行操作。如何像fetchAll和fetRow那样,返回一个Zend_Db_Row对象呢?
同样的,打开源码,在里面找方法。第一想法,因为Zend_Db_Row有toArray()方法,将Zend_Db_Row转换为数组,所以它应该提供一种类似的方法,将数组转换成Zend_Db_Row。事实上,的确有:setFromArray。
兴冲冲地把listNews()返回的数组往Zend_Db_Row::setFromArray()里一扔,竟然抛出异常:
程序代码function indexAction()
{
$new = new News();
$row = new Zend_Db_Row();
$this->view->news = $row->setFromArray($news->listNews());
}
仔细一想,listNews(),即_fetch方法返回的应该是二维数组,形如array(array('title'=>'Title', 'hit'=>0), array('title'=>'Title1', 'hit'=>2))、而setFromArray能接受的是类似array('title'=>'Title', 'hit'=>0)的一维数组。
其实,fetchAll()可以直接接受Zend_Db_Select作为参数,问题迎刃而解!
程序代码<?php
class News extends Zend_Db_Table
{
protected $_name = 'news';
function listNews($pagenum = 0, $pagesize = 15)
{
$s = $this->select();
$s->from($this->_name,array('id','title','pubdate','hit'));
return $s;
}
}
class News extends Zend_Db_Table
{
protected $_name = 'news';
function listNews($pagenum = 0, $pagesize = 15)
{
$s = $this->select();
$s->from($this->_name,array('id','title','pubdate','hit'));
return $s;
}
}
IndexController.php:
程序代码<?php
class IndexController extends Zend_Controller_Action
{
function indexAction()
{
$news = new News();
$this->view->news = $news->fetchAll($news->listNews());
}
}
class IndexController extends Zend_Controller_Action
{
function indexAction()
{
$news = new News();
$this->view->news = $news->fetchAll($news->listNews());
}
}
index.phtml:
程序代码<table>
<tr>
<th>Title</th>
<th>Hit</th>
<th>Time</th>
</tr>
<?php foreach($this->news as $n):?>
<tr>
<td><?php echo $n->title;?></td>
<td><?php echo $n->hit;?></td>
<td><?php echo $n->pubdate;?></td>
</tr>
<?php endforeach;?>
</table>
<tr>
<th>Title</th>
<th>Hit</th>
<th>Time</th>
</tr>
<?php foreach($this->news as $n):?>
<tr>
<td><?php echo $n->title;?></td>
<td><?php echo $n->hit;?></td>
<td><?php echo $n->pubdate;?></td>
</tr>
<?php endforeach;?>
</table>

