1

我是 zend 框架的新手,在这个简单的函数中,我想获得一个“帖子”,然后我想在相关表中找到所有评论

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;

}

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

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

哪里错了?

4

3 回答 3

5

我认为您对如何使用 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 的所有评论。

于 2013-01-13T17:51:48.650 回答
1

问题是,除非您像前面提到的那样定义表类,否则您不能使用依赖行集或父行集。

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

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,您需要了解“定义表类”。至少足以在您自己的课程中使用它们。

我希望这有帮助!

于 2013-01-15T06:14:56.620 回答
0

要获取行集和相关行集,您必须使用Zend_Db_Table. 您只使用Zend_Db_Adapterwith Zend_Db_Select

这里阅读。所以你必须定义一个从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'");

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

于 2013-01-13T16:27:01.473 回答