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);
}
Но это решение видится мне несколько костыльным.
Подскажите, как организовать такой метод?

21 Авг 2019 в 07:09
197 +1
1
Ответы
1

В 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 в зависимости от типа пользователя и скопирует атрибуты пользователя в новый объект.

Надеюсь, это поможет вам решить вашу проблему.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир