====== Отложенная загрузка некоторых атрибутов. Lazy Attributes ======
Иногда принимать все поля из таблицы базы данных - это непозволительная роскошь. Например, у нас есть объекты документы (Document), которые в себе содержат поле контент (content), аннотацию, заголовок и т.д. Если нам на определенной странице сайта необходимо показать ссылки на 30 последних документов вместе с аннотацией, тогда зачем нам нужно выбирать также и все поля content? Ведь это приведет к излишнему расходу памяти и трафику между web-сервером и сервером базы данных, даже если мы будем выбирать элементы по одному и если база данных и web-сервер находятся на одной машине.
Для этих случаев lmbActiveRecord поддерживает так называемые "ленивые атрибуты" Lazy Attributes, которые загружаются из базы данных лишь в том случае, когда их реально запросили.
Для определения того, какие поля являются Lazy используется атрибут **$_lazy_attributes**, содержащий список таких полей:
class Document extends lmbActiveRecord
{
protected $_lazy_attributes = array('annotation', 'content');
}
Теперь если мы создадим объект класса Document, загрузим его из базы, то сразу после загрузки некоторые поля его будут еще недоступны:
$document = new Document();
$document->setTitle('a short title');
$document->setAnnotation('not so long annotation');
$document->setContent('very long content');
$document->save();
$loaded_document = new Document($document->getId());
$object->hasAttribute('news_date'); // Вернет true
$object->hasAttribute('annotation'); // Вернет false
$object->hasAttribute('contemt'); // Вернет false
$object->getAnnotation(); // Вернет not so long annotation
$object->hasAttribute('annotation'); // Вернет true
===== Явное указание загрузки аттрибутов =====
Чтобы сразу загрузить "ленивые" аттрибуты вместе с другими нужно указать специальную опцию в find методе:
$obj = lmbActiveRecord::find('Document', array('with_lazy_attributes' => true));