Zend框架当前获取单行的方法

时间:2013-01-13 16:03:04

标签: php zend-framework zend-db zend-db-table

我是zend框架的新手,在这个简单的函数中我想得到一个'post'然后我想找到相关表中的所有注释

public function getPost($idPost)
{
    $db=  Zend_Registry::get('db');

    $select=$db->select()
            ->from($this->_name, '*')
            ->where("idPost= ".$db->quote($idPost, 'INTEGER'));

    $stmt=$select->query();
    $rowset=$stmt->fetchAll();
    $post=$rowset->current();

    //ora devo aggiungerci i commenti che questo post ha ricevuto
    $comm=$post->findDependentRowset('commenti');

    $ris=array($post, $comm);

    return $ris;

}

在我的索引控制器中我只是调用此函数,但我收到此错误:

Call to a member function current() on a non-object in C:\xampp\htdocs\...

哪里出错了?

3 个答案:

答案 0 :(得分:4)

我认为您对如何使用Zend_Db有一些误解。

1。您没有使用ORM,只使用PDO包装器

这意味着,您的查询不会返回Zend行集和行,因此您无法使用您可以使用的方法。

2。默认提取模式

Zend_Db_Statement fetchAll()方法的默认提取模式是数组,如果您希望它返回一个对象(stdClass),请在获取数据之前更改提取模式:

$stmt->setFetchMode(Zend_Db::FETCH_OBJ);

3。当你真正想要一行时使用fetchAll()

如果你只想要一行,那就不要拿整张桌子了!使用Zend_Db_Statement,例如:

$row = $stmt->fetch();

$rowObj = $stmt->fetchObject();

...再次,这不是一个zend行对象,只是一个stdClass实例,但你可以这样做:

$rowObj->some_field;

就可以了。

另一方面,如果这是Post模型中的方法,它应该类似于:

public function getPost($idPost)
{
    return $this->getRow($idPost);
}

这将返回帖子,然后,如果您正确设置了表格关系,您还可以查询相关数据或仅分别获取具有该ID的所有评论。

答案 1 :(得分:1)

问题在于,除非您如前所述define a table class,否则不能使用从属或父行集。

要使当前功能正常工作,最好使用两个功能,并保持简单:

public function getPost($idPost)
{
    $db= new Zend_Db_Table($this->_name);

    $select=$db->select()
            ->where("idPost= ?", $idPost);
    /*Fetch just the row you want, or use fetchAll() if you need to match return types*/   
    $row = $db->fetchRow($select);

    return $row;

}

public function getComments($table='comments', $id) {

    $db = new Zend_Db_table($table);

    $select = $db->select()->where('post_id = ?', $id)->order('date ASC');
    $rowset = $db->fetchAll($select);

    return $rowset/* or you could return an array ->$rowset->toArray() */

}

Zend_Db_Table将尝试使用当前的数据库适配器,因此您需要做的就是传入表名。

还有一点需要注意:使用quote()时,您无需使用任何select()功能。

但是非常重要的是,如果您打算使用Zend_Db,您需要了解“定义表类”。至少足以在你自己的课堂上使用它们。

我希望这有帮助!

答案 2 :(得分:0)

要获取行集和相关行集,必须使用Zend_Db_Table。 您只能将Zend_Db_AdapterZend_Db_Select一起使用。

here读取。 所以你必须定义一个从Zend_Db_Table_Abstract扩展的类。

示例:

class Bugs extends Zend_Db_Table_Abstract
{
    protected $_name = 'bugs';
    protected $_primary = 'bug_id';
}

要使用Zend_Db_Table_Rowset对象:

$bugs   = new Bugs();
$rowset = $bugs->fetchAll("bug_status = 'NEW'");

要查找相关行集,您必须在表类中定义关系。看here如何定义关系。