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'а.
- 14 Разработка приложения на Yii. Урок 14: Выводим список категорий как новый виджет на сайте (29.04.2015)
- 13 Разработка приложения на Yii. Урок 13: Внедряем категории для статей. (29.04.2015)
- 12 Разработка приложения на Yii. Урок 12: Профилирование приложения, включаем кеширование. (20.01.2015)
- 11 Yiico. Видеокурс по разработке сайта на Yii. Урок 11: Отладка приложения, включаем журналирование. (20.01.2015)
- 10 Yiico. Видеокурс по разработке сайта на Yii. Урок 10: Если ваше приложение находится не в корневой папке, а во вложенной. (19.10.2014)
- 9 Разработка сайта на Yii с нуля. Урок 9. Выборка статей определённого автора. (13.08.2014)
- 8 Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода? (25.07.2014)
- 7 Разработка сайта на Yii с нуля. Урок 7. Изменение количества выводимых записей на странице в CGridView. Включаем сессии Yii. (04.09.2013)
- 6 Разработка сайта на Yii с нуля. Урок 6. Автоматич. отправка оповещений об одобренных комментариях на email автора комментария (11.08.2013)
- 5 Разработка сайта на Yii с нуля. Урок 5. Переименовываем blog в yiico. Изменяем "Home" в breadcrumbs. Включаем Gzip-сжатие. (09.08.2013)
- 4 Курс по Yii с нуля. Урок 4. Дорабатываем простую работу с пользователями: хранение пароля при редактировании пользователя. (13.04.2013)
- 3 Курс по Yii с нуля. Урок 3. Создаём новых пользователей. Организуем простую систему авторизации. Аутентификация, пароли, соли. (20.07.2014)
- 2 Yii + Git (github) на Mac. (24.03.2013)
- 2 Курс по Yii с нуля. Урок 2. Переносим и настраиваем Yii и проект нашего сайта на рабочем сервере. Избавляемся от index.php в url (09.07.2014)
- 1 Курс по Yii с нуля. Урок 1. Устанавливаем Yii на локальном компьютере. Заводим проект будущего сайта. (10.03.2013)
- 0 Composer – пакетный менеджер PHP. Что и как? (22.07.2014)
- 0 MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) (22.05.2014)
- 0 Yii: Статичные страницы (создание, редактирование, удаление) (28.04.2014)
- 0 Yii: Расширение ECKEditor = Связка ckeditor + kcfinder (визуальный редактор с бесплатным файловым менеджером) (28.04.2014)
- 0 Yii: Bootstrap tabs, делаем активной вкладку на которую выполняется переход по ссылке (20.03.2014)
- 0 Yii: Доступ к атрибуту модели из файла шаблона (Вызов в шаблоне какого-либо атрибута модели). (17.02.2014)
- 0 Yii: Множественный автокомплит с помощью CJuiAutoComplete (автокомплит нескольких значений в одно поле) (07.02.2014)
- 0 Yii: Фотогалерея через поведение (доработка расширения imagesgallerymanager) (08.03.2016)
- 0 Yii: Установка и настройка Yii-app заготовки приложения от Crisu83 (09.03.2014)
- 0 Twitter Bootstrap Carousel Crossfade (09.09.2013)