Yii: Пример с вложенной жадной загрузкой 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)