1

Articles テーブルからデータをフェッチしていますが、返された結果を別のテーブルのデータで拡張したいと考えています。例えば:

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 つのクエリ (結合を使用、方法がわからない) を作成し、必要なすべてのデータを一度にフェッチする方がよいでしょうか?

4

2 に答える 2

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';
}

次に、フェッチされた行にカテゴリ名を設定できます。

于 2012-06-23T10:15:45.547 に答える
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

于 2012-06-23T10:17:06.810 に答える