внутреннее соединение рамок yii - PullRequest
0 голосов
/ 25 августа 2011

У меня есть класс Articles с отношением 1: N к таблице Dates. Мне нужно показать список статей для каждой даты. Я использую 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] -> dat , dat - это массив дат, а не дата объекта? Спасибо

1 Ответ

2 голосов
/ 09 сентября 2011

У 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, надеюсь, это поможет вам.

...