Читайте также:
|
|
Самый простой способ выполнить реляционный запрос — использовать реляционное свойство 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 | Поможем написать вашу работу | Нарушение авторских прав |