не встречал подобного рецепта и вообще обсуждения этой проблемы в рамках yii.
ситуация:
есть таблица в которой находятся данные разных типов, например:
таблица топиков, которые могут иметь тип "топик-вопрос" или "топик-обсуждение".
id типа хранится в поле type.
каждый тип, помимо общих данных, может содержать свои собственные(в доп таблицах).
соответствено в приложении мы создаем класс
Topic extends CActiveRecord
и классы Question и Discussion, наследуемые от Topic и реализующие свои собственные методы и свойства.
Поиск в таблице происходит как и обычно методами find* CActiveRecord.
но при этом нам нужно заставить AR, создавать не просто экземпляр класса Topic, а соответствующие Question и Discussion, в зависимости от типа.
решение простое, в моделях AR нужно всего лишь переопределить метод instantiate, например в классе Topic так:
Код: Выделить всё
protected function instantiate($attributes)
{
switch($attributes['type'])
{
case 1:
$class = 'Question';
break;
case 2:
$class = 'Discussion';
break;
default:
$class=get_class($this);
break;
}
$model=new $class(null);
return $model;
}
ЗЫ: рецепт для тех кто не читает документацию к API, так как данная ситуация рассмотрена в комментарии к методу.