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); } Но это решение видится мне несколько костыльным. Подскажите, как организовать такой метод?
В Yii можно использовать метод instantiate() для создания экземпляра класса наследника на лету. В вашем случае, вы можете использовать следующий код в методе find():
В Yii можно использовать метод instantiate() для создания экземпляра класса наследника на лету. В вашем случае, вы можете использовать следующий код в методе find():
public function find($condition='', array $params=[]) {$user = parent::find($condition, $params);
$class = ($user->getType() == 'customer') ? 'Customer' : 'Employee';
$model = $this->instantiate($class);
$model->attributes = $user->attributes;
return $model;
}
Этот код создаст экземпляр класса Customer или Employee в зависимости от типа пользователя и скопирует атрибуты пользователя в новый объект.
Надеюсь, это поможет вам решить вашу проблему.