Вопрос По Active Record

Изучая Yii, открыл для себя паттерн Active Record. Сразу де возникла идея применить некоторые полученные знания в другом своем проекте (не на Yii). В частности речь идет о возможности представления столбцов таблицы из бд свойствами объекта. Но тут для меня возникает одна непонятка. Допустим, есть таблица «books». Создали объект $model , применили метод поиска конкретной книги по id (аналог findbyPk в Yii) и теперь хотим обращаться к свойствам объекта, таким как author, col_pages и т.д. (которые являются одноименными столбцами в таблице books). Понять не могу следующего: изначально в описании класса же нет таких свойств как author и col_pages, каким образом мы тогда к ним обращаемся?

Насколько я знаю в Yii делается примерно так:

$model = Book::model()->findbyPk(1); // нашли книгу с id=1

И затем можем обращаться к любым свойствам этой книги таким способом:

$model->author;

Получается, что переменная author должна быть описана в классе books изначально, чтобы мы могли к ней обращаться?

Т.е. в момент вызова $model = Book::model()->findbyPk(1); все свойства 1-ой книги из базы берутся и записываются в одноименные свойства класса books?

Или же эти свойства класса каким-то образом генерируются динамически в момент обращения к бд?

Обратите внимание на лог запросов Yii в дебаг-режиме. Там довольно много SHOW TABLE (и аналогов).

Вот на основании полученных метаданных строится схема объекта.

(отсюда, кстати, занятный спецэффект: если выключить дебаг, включить кеширование схемы а потом добавить в таблицу колонку - при обращении к этой колонке будет вылетать эксепшн)

Во первых AR в yii - это не паттерн, это ORM, тоесть уже реализация паттерна.

Во вторых - если хотите применить что то подобное(или написать), смотрите сорсы.




public function findByPk($pk,$condition='',$params=array())

	{

		Yii::trace(get_class($this).'.findByPk()','system.db.ar.CActiveRecord');

		$prefix=$this->getTableAlias(true).'.';

		$criteria=$this->getCommandBuilder()->createPkCriteria($this->getTableSchema(),$pk,$condition,$params,$prefix);

		return $this->query($criteria);

	}



Вот например функция findByPk(). Как вы видите здесь есть $this->getTableSchema(), это запрос SHOW FULL COLUMNS FROM (если мне не изменяет память), именно отсюда AR узнает какие поля у вас есть, создает обьект, а при обращении к данным - подтягивает их.

CActiveDataProvider например имеет еще 1 очередь - SELECT COUNT(*) FROM , для определения количества записей (для пагинации и прочего).

Если уж сильно хотите - идите по коду и пробуйте реализовывать сами (чего не советую новичку), или возьмите готовый AR - http://www.phpactiverecord.org/

Вообще, для реализации “возможности представления столбцов таблицы из бд свойствами объекта” достаточно запросить запись с флагом PDO::FETCH_OBJ или PDO::FETCH_CLASS :)

Такой вот мини-AR :)) (осталось только сохранение приделать)