Наследование с одной таблицей в AR

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Наследование с одной таблицей в AR

Сообщение pirrat »

Single Table Inheritance mapping pattern
не встречал подобного рецепта и вообще обсуждения этой проблемы в рамках 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, так как данная ситуация рассмотрена в комментарии к методу.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Наследование с одной таблицей в AR

Сообщение slavcodev »

хихи, и верно это метод затерялся среди евентов в АПИ, не заметил его.
Жду Yii 3!
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Наследование с одной таблицей в AR

Сообщение Ekstazi »

Давно пользуюсь этим )
Аватара пользователя
s2ral
Сообщения: 7
Зарегистрирован: 2013.04.12, 09:20
Откуда: Azerbaijan(Baku)

Re: Наследование с одной таблицей в AR

Сообщение s2ral »

interesting but little info.show how to realize this code in action
Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Наследование с одной таблицей в AR

Сообщение slavcodev »

It some as simple action

Код: Выделить всё

function actionIndex() {
  foreach (Topic::model()->findAll() as $topic) {
     echo get_class($topic);
  }
}
function actionCreate() {
  $model = new Discussion();
} 
Жду Yii 3!
Аватара пользователя
twix
Сообщения: 86
Зарегистрирован: 2011.12.12, 18:25

Re: Наследование с одной таблицей в AR

Сообщение twix »

Прекрасная вещь! Обязательно добавлю ее у себя.
Ответить