Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Выполнение реляционного запроса

Читайте также:
  1. II. Выполнение п р о ц е д у р ы
  2. II. Выполнение п р о ц е д у р ы
  3. Атрибуты запроса
  4. Вопрос 52. Порядок подачи заявок на выполнение международного полета.
  5. Выполнение Java-программы
  6. Выполнение Java-программы
  7. ВЫПОЛНЕНИЕ ВКР, ЕЕ СТРУКТУРА
  8. Выполнение внутривенной инъекции
  9. Выполнение внутримышечной инъекции
  10. Выполнение жима лежа на максимальный результат. (3 часа).

Самый простой способ выполнить реляционный запрос — использовать реляционное свойство AR-класса. Если обращение к этому свойству производится впервые, то будет выполнен реляционный запрос, который соединит связанные таблицы и оставит только данные, соответствующие первичному ключу текущего экземпляра AR. Результат запроса будет сохранён в свойстве как экземпляр (или массив экземпляров) связанного класса. Этот подход также известен как «отложенная загрузка» (lazy loading), при которой непосредственный запрос выполняется только в момент первого обращения к связанным объектам. Ниже приведён пример использования этого подхода:

// получаем запись с ID=10

$post=Post::model()->findByPk(10);

// Получаем автора записи. Здесь будет выполнен реляционный запрос.

$author=$post->author;

Информация: Если связанные данные не найдены, то соответствующее свойство примет значение null для связей BELONGS_TO и HAS_ONE или будет являться пустым массивом для HAS_MANY и MANY_MANY. Стоит отметить, что связи HAS_MANY и MANY_MANY возвращают массивы объектов, и обращаться к их свойствам необходимо в цикле, иначе можно получить ошибку «Trying to get property of non-object».

Способ отложенной загрузки удобен, но не всегда эффективен. Например, если нам потребуется получить информацию об авторах N записей, то использование отложенной загрузки потребует выполнения N дополнительных запросов к базе данных. В данной ситуации разумно использовать метод «жадной загрузки» (eager loading).

Этот метод заключается в загрузке всех связанных данных вместе с основным экземпляром AR. Реализуется этот подход путем использования метода with() вместе с методом find или findAll. Например:

$posts=Post::model()->with('author')->findAll();

Приведённый код вернёт массив экземпляров Post. В отличие от отложенной загрузки, свойство author каждой записи будет заполнено связанным экземпляром User ещё до обращения к этому свойству. Таким образом, вместо выполнения отдельного запроса для каждой записи, жадная загрузка получит все записи вместе с их авторами в одном запросе!

В методе with() можно указать несколько связей, и жадная загрузка вернёт их за один раз. Например, следующий код вернёт записи вместе с их авторами и категориями:

$posts=Post::model()->with('author','categories')->findAll();

Кроме того, можно осуществлять вложенную жадную загрузку. Для этого вместо простого списка имён связей, мы передаем методу with() имена связей, упорядоченных иерархически, как в следующем примере:

$posts=Post::model()->with(

'author.profile',

'author.posts',

'categories')->findAll();

Пример выше вернёт нам все записи вместе с их авторами и категориями, а также профиль каждого автора и все его записи.

Жадная загрузка может быть выполнена путём указания свойства CDbCriteria::with:

$criteria=new CDbCriteria;

$criteria->with=array(

'author.profile',

'author.posts',

'categories',

);

$posts=Post::model()->findAll($criteria);

или

$posts=Post::model()->findAll(array(

'with'=>array(

'author.profile',

'author.posts',

'categories',

)

));




Дата добавления: 2015-09-10; просмотров: 70 | Поможем написать вашу работу | Нарушение авторских прав

Статистический запрос | Реляционные запросы с именованными группами условий | Reflexives | Adjectives | Volunteer: ??? | Project description |


lektsii.net - Лекции.Нет - 2014-2025 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав