yii框架内连接

时间:2011-08-25 12:06:40

标签: sql yii entity-relationship inner-join

我有一个与表日期有1:N关系的文章。我需要显示每个日期的文章列表。我使用带有Inner连接的findBySql。

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

我不明白为什么当我尝试访问文章[$ key] - &gt; dat 时, dat 是一个日期数组而不是对象日期? 感谢

1 个答案:

答案 0 :(得分:2)

Yii有一种透明的方式(没有编写sql)来做到这一点。您可以在模型上使用范围和关系方法来获取数据。

这种方式的优点是,与findBySql不同,您需要在每次要查找内容时定义sql,您可以使用多次范围和关系。

因此假设您有一个名为Article的模型而另一个名为Date的模型,您的模型将显示如下:

  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上执行它的正确方法,我希望能帮到你。