2011-08-25 131 views
0

我有一個類與表日期1:N關係的文章。我需要顯示每個日期的文章列表。我使用一個帶有Inner連接的findBySql。yii框架內部連接

'SELECT * 
      FROM articles_art as art 
      INNER JOIN dates_dat as dat 
      ON art.id_art = dat.idart_dat 
      WHERE art.validated_art = 1 
       AND dat.date_dat <= "' . $todayDate . 
      '" ORDER BY dat.date_dat, art.rank_art'); 

我不明白是爲什麼,當我嘗試訪問的文章[$關鍵] - >DATDAT是日期的數組而不是對象日期? 謝謝

+0

你有一個名叫「dat」的關係嗎? 1:n關係將返回一個數組。嘗試在這裏更改搜索元素的名稱。 – ldg

+0

「更改搜索元素的名稱」是什麼意思? – Pietro

+0

如果您的關係試圖返回一個名爲「dat」的值,並且您在上述查詢中定義了一個名爲「dat」的值,則可能會有衝突。 – ldg

回答

2

Yii有一個透明的方式(無需編寫sql)來做到這一點。您可以在模型上使用範圍和關係方法來獲取數據。

這種方式的好處是,與findBySql不同的是,每次需要查找某個內容時都需要定義一個sql,因此可以使用多次範圍和關係。

所以假設你有一個模型叫條和另一個叫日期,你的模型將顯示像:

class Articles extends CActiveRecord { 
    … 

    public function relations() { 
     return array('date' => array(self::BELONGS_TO, 'Date', 'date_id')); 
    } 

    public function scopes() { 
     return array('validated' => array('condition' => 'validated_art=1')); 
    } 

    … 
    } 

    class Date extends CActiveRecord { 
    … 

    public function relations() { 
     return array('articles' => array(self::HAS_MANY, 'Article', 'date_id')); 
    } 

    public function scopes() { 
     return array('byDate' => array('order' => 'date_dat'), 
        'validated' => array('condition' => 'date_dat < 2011-xx-xx')); 
    } 
    … 
    } 

而且你的發現將顯示喜好:

$model = Date::model()->validated()->byDate()->findAll(); 
    foreach($model->articles as $k => $article) { 
    echo $article->title; 
    } 

上面的代碼只是一個例子來說明對Yii做正確的方法,我希望對你有所幫助。