Всем добрый день.
Предположим, имеется некоторое расширение для Yii2, например, каталог, в котором имеется модель Orders, которую в свою очередь я хочу связать с моделью Users. Пример структуры базы:
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL
)
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
)
И соответственно две модели:
class Order
{
}
class User
{
}
Я хочу добавить в модель Order релейшен к User, например так:
...
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id'];
}
...
но вот в этом месте есть одна важная особенность: модели Order и User (и соответственно таблицы, создаваемые с помощью миграций) находятся в разных модулях/расширениях. Причем, модуль для пользователей может быть заменен на другой (например, в другом проекте).
Соответственно, я не могу просто указать ссылку на User::className(), потому что имя класса и его неймспейс могут быть другими.
Таким образом, вопрос в следующем: как указать в методе getUser ссылку на класс User, который будет соответствовать текущему проекту?
Мои варианты
- В свойствах модуля для Order добавить свойство $userClass и прописывать туда имя класса
- Переопределять класс Order в некотором месте (например, в Bootstrap приложения) с помощью класса-наследника и уже в этом наследнике задавать relation, например:
class OrderWithUser extends Order {
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id'];
}
}
// В bootstrap
Yii::$container->set('namespace/to/Order', 'namespace/to/subclass/OrderWithUser')