Yii: как сменить класс модели с предка на наследника на лету?

Добрый день.

Есть сущность "пользователь" и две дочерних сущности "подрядчик" и "заказчик". Модель User содержит методы общие для обоих наследников и метод getType(), который определяет кем является текущий пользователь.

Мне нужно, чтобы метод find возвращал объект класса Employee или Customer, в зависимости от его типа. Что-то вроде:
public function find($condition='', array $params=[]) {
$user = parent::find($condition, $params);
  return ($user->getType() == 'customer')
    ? <Модель заказчика>
    : <Модель подрядчика>;
}


Но как сделать из текущего класса экземпляр класса наследника? Просто присвоение атрибутов не прокатит т.к. много приватных свойств.

Единственный выход, который я вижу - это внутри метода делать запрос на выборку объекта для одного из наследников. Вроде следующего:
public function find($condition='', array $params=[]) {
$user = parent::find($condition, $params);
  return ($user->getType() == 'customer')
    ? Customer::model()->findByPk($user->id)
    : Employee::model()->findByPk($user->id);
}

Но это решение видится мне несколько костыльным.

Подскажите, как организовать такой метод?
  • Вопрос задан
  • 2632 просмотра
Решения вопроса 1
@MaxHero
Ваша задача решается с помощью метода CActiveRecord::instantiate . В этом методе мы анализируем значения полей строки из БД (поле type) и возвращаем новый экземпляр требуемого объекта.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
metamorph
@metamorph
То, что Вы хотите, в общем случае называется polymorphic relations.
Решается по-разному.
Ответ написан
Комментировать
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы