2011-08-25 96 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做正确的方法,我希望对你有所帮助。