2012-06-23 62 views
1

我正在从文章表中获取数据,但我想用另一个表中的一些数据来扩展返回的结果。 例如:添加额外的数据来选择查询结果

public function getArticlesByCategoryId($category_id = 0) { 
    $select = $this->_db->select() 
      ->from($this->_name) 
      ->limit(5) 
      ->order("pubDate DESC"); 

    $result = $this->_db->fetchAll($select); 

    $mCategories = new Model_Categories(); 

    foreach($result as $row) { // as &$row doesn't work 
     $category_name = $mCategories->getNameById($row["category_id"]); 
     $row["category_name"] = $category_name; // this to add to $result but dunno how 
     // blah blah... 
    } 

    return $result; // the new one with ...->category_name in it. 
} 

我希望你能明白我所期待的。 或者,也许最好是写一个单一的查询(连接,不知道如何),并获取一次所需的所有数据,而无需调用另一个模型的方法?

回答

1

这确实看起来像你应该使用join。这绝对是解决您的问题的最简单方法。下面的查询会做的伎俩:

$select = $this->_db->select() 
     ->from($this->_name) 
     ->join('category_table', 'category_table.id = ' . $this->_name . '.category_id', array('category_name')) 
     ->limit(5) 
     ->order("pubDate DESC"); 

这将类别名称添加到该行。


如果您不想使用联接,则可以使用自定义行类将自定义字段添加到行中。然而,这需要更多的工作。创建类,如下所示:

class MyApp_Model_Row_MyRow extends Zend_Db_Table_Row_Abstract 
{ 
    public $categoryName; 
} 

那么你应该在你的DBTABLE类表示要使用这个新行类:

class MyApp_Model_DbTable_Articles extends Zend_Db_Table_Abstract 
{ 
    ... 
    protected $_rowClass = 'MyApp_Model_Row_MyRow'; 
} 

然后,您可以读取的行中设置的类别名称。

+0

非常感谢你Stardev,它就像一个魅力! – enenen

+0

只有setIntegrityCheck发生错误:无法识别的方法'setIntegrityCheck()'。但即使没有它,结果也是正确的。我认为这是我的错,因为我不确定我的整个Zend应用程序是否配置正确。 – enenen

+0

啊谢谢指出,我的不好:'setIntegrityCheck()'应该只在与Zend_Db_Table_Select对象连接时被调用。由于我们在db-instance本身上调用了'select()',因此会创建一个'Zend_Db_Select'对象,并且可以省略'setIntegrityCheck()'。更新了答案。很高兴它的工作。 – Config

0

为了让您的类别表数据的所有文章您的查询可能看起来像:

$select = $this->_db->select() 
      ->from($this->_name) 
      ->joinLeftUsing('category','category_id', array('category_name')) 
      ->order("pubDate DESC"); 

参见:http://framework.zend.com/manual/en/zend.db.select.html