Zend框架当前方法获得单行


Zend framework current method to get single row

我是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;
}

在我的索引控制器I我只是调用这个函数,但我得到这个错误:

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

错在哪里?

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

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

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

2。默认获取模式

Zend_Db_Statement fetchAll()方法的默认获取模式是array,如果你想让它返回一个对象(stdClass),在获取数据之前改变获取模式:

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

3。当你需要一行

时使用fetchAll()

如果你只需要一行,那么不要获取整个表!对于Zend_Db_Statement,使用如下示例:

$row = $stmt->fetch();

$rowObj = $stmt->fetchObject();

…这不是一个zend row对象,只是一个stdClass实例,但你可以这样做:

$rowObj->some_field;

另一方面,如果这是Post模型中的一个方法,它应该看起来像:
public function getPost($idPost)
{
    return $this->getRow($idPost);
}

这将返回文章,然后,如果您已经正确设置了表关系,您还可以查询依赖数据或单独获取带有该id的所有评论。

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

要使当前的函数工作,最好使用两个函数,并保持简单:

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将尝试使用当前的数据库适配器,因此您所需要做的就是传入表名。

另一个注意事项:当使用select()时,您不需要使用任何quote()功能。

但是非常重要的是,如果你要使用Zend_Db,你需要学习"定义表类"。至少足以在你自己的类中使用它们。

我希望这对你有帮助!

要获得行集和相关行集,您必须使用Zend_Db_Table。您只能使用Zend_Db_AdapterZend_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'");

要查找依赖行集,必须在表类中定义关系。看一下如何定义关系。