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作为参数,问题迎刃而解!
程序代码 程序代码
<?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;
    }
}


IndexController.php:
程序代码 程序代码
<?php
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>



[本日志由 lly365 于 2008-11-14 03:49 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: php zendframework zf 特定字段
评论: 2 | 引用: 0 | 查看次数: -
回复回复lly365[2008-11-19 03:16 PM | del]
对,Zend Framework。也是边用边学。
最近接触到了一个比较有趣的Web Editor -- tiny_mce
回复回复飞鱼[2008-11-19 11:27 AM | del]
最近在学习cakephp . 也有MVC.

你这个是zend的框架吗?

发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.