我是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\...
哪里出错了?
答案 0 :(得分:4)
我认为您对如何使用Zend_Db有一些误解。
这意味着,您的查询不会返回Zend行集和行,因此您无法使用您可以使用的方法。
Zend_Db_Statement fetchAll()方法的默认提取模式是数组,如果您希望它返回一个对象(stdClass),请在获取数据之前更改提取模式:
$stmt->setFetchMode(Zend_Db::FETCH_OBJ);
如果你只想要一行,那就不要拿整张桌子了!使用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_Adapter
与Zend_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如何定义关系。