Изучая 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 (осталось только сохранение приделать)