Yii: Пример с вложенной жадной загрузкой AR (Active Record) при работе со связанными таблицами (Реляционная Active Record)

Yii: Пример с вложенной жадной загрузкой AR (Active Record) при работе со связанными таблицами (Реляционная Active Record) Использование AR (Active Record) для работы со связанными таблицами (Реляционная Active Record)

Чтобы понять, что такое Active Record  и как это использовать для реализации CRUD-операций - почитайте статью в официальной документации Yii - Работа с БД: Active Record

И дальше статью о том, как использовать AR для работы со связанными таблицами.

Я же тут вкратце опишу основные тонкости.

В папке protected/models создаются модели - это и есть определения классов AR. Каждый класс AR представляет одну таблицу базы данных. В файл config/main.php пишут:

return array(
  'import'=>array(
      'application.models.*',
  ),
);

Это включает все классы в папке protected/models, т.к. все классы часто используются в разных контроллерах.

$post=new Post;
$post->title='тестовая запись';

так создаётся экземпляр класса Post (строка в таблице), и устанавливается значение для атрибута title (поле title).


Для чтения данных из таблицы БД нужно вызвать метод find. Статический метод model() обязательный:

// найти первую строку, удовлетворяющую условию
$post=Post::model()->find($condition,$params); //$condition это как WHERE, $params - массив параметров
$post=Post::model()->find('postID=:postID', array(':postID'=>10)); //:postID - маркер
// найти строку с указанным значением первичного ключа
$post=Post::model()->findByPk($postID,$condition,$params);
// найти строку с указанными значениями атрибута
$post=Post::model()->findByAttributes($attributes,$condition,$params);
// найти первую строку, используя некоторое выражение SQL
$post=Post::model()->findBySql($sql,$params);

Если выбрать нужно много строк, то вместо find пишем findAll

// найдем все строки, удовлетворяющие условию
$posts=Post::model()->findAll($condition,$params);
// найдем все строки с указанными значениями первичного ключа
$posts=Post::model()->findAllByPk($postIDs,$condition,$params);// найдем все строки с указанными значениями атрибута
$posts=Post::model()->findAllByAttributes($attributes,$condition,$params);// найдем все строки, используя SQL-выражение
$posts=Post::model()->findAllBySql($sql,$params);


Теперь переходим к реляционной Active Record. Это нужно, когда интересно получить объединённый набор данных из нескольких связвнных таблиц. Это, как и многое другое хорошо описано где? - В документации (читать надо вдумчиво и осознанно!)

Приведу свой пример, потому что он немного отличается по форме от тех, что у авторов. Просто обращаю внимание, что так можно делать.

Если кто-то использует $criteria->addSearchCondition (например, в зависимости от параметра делается критерий запроса), то так тоже можно осуществлять "вложенную жадную загрузку".

В контроллере, в методе actionIndex:

$criteria=new CDbCriteria(array(
            'condition'=>'t.status='.Material::STATUS_PUBLISHED,
            'order'=>'t.create_time DESC',
            'with'=>'author',
        ));
        if(isset($_GET['tag']))
            $criteria->addSearchCondition('tags',$_GET['tag']);
        if(isset($_GET['username']))
            $criteria->addSearchCondition('author.username',$_GET['username']);
        $dataProvider=new CActiveDataProvider('Material', array(
            'pagination'=>array(
                'pageSize'=>Yii::app()->params['materialsPerPage'],
            ),
            'criteria'=>$criteria,
        ));

и это работает, конечно в relations (в моделе Material) должно быть объявлено отношение между классами статей и пользователей:

'author' => array(self::BELONGS_TO, 'YumUser', 'author_id'),

YumUser использую, потому что работаю с модулем yii-user-management, но это уже совсем другая история.

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.