我在Yii框架中遇到HAS_ONE关系问题。方案如下: 我们有一个与SubscriptionType相关的User类:
'subscriptionType' => array(self::HAS_ONE, 'SubscriptionType', 'subscription_type_id')
与用户有关的SubscriptioType:
'users' => array(self::HAS_MANY, 'User', 'subscription_type_id')
此外,用户在数据库中定义了SubscriptionType的外键。
预定义了3种订阅类型,并且所有注册用户在注册期间默认获得其中一种。它们保存在DB中,所以在registerAction中我做了:
//some assignments here
$subscription = SubscriptionType::model()->find('name=:name', array(':name'=>SubscriptionType::MONTHLY));
$newUser->subscriptionType = $subscription;
if($newUser->save()){
//redirect to some page
} else {
Yii::trace('User register failed', 'application.controllers.UserController');
}
用户无法保存。我对它进行了一些调整,我注意到,subscriptionType已分配,但subscription_type_id未分配,因此INSERT查询抛出了约束违规。 我是否必须明确设置subscription_type_id?它对我来说没有多大意义,因为它违背了ORM的想法,不是吗?
答案 0 :(得分:2)
我认为你错误地定义了关系。 HAS_ONE用于一对一关系的父方,而HAS_MANY用于一对多关系的父方。你需要在其中一个上面有一个BELONGS_TO,它应该在关系的子方面。我猜你的用户模型应该有这样的BELONGS_TO:
'subscriptionType' => array(self::BELONGS_TO, 'SubscriptionType', 'subscription_type_id')
您遇到的另一个问题是,您尝试为subscripionType分配一个值,因为它更像是一个只读属性,因为它是由框架填充的。对于HAS_ONE或BELONGS_TO,这将是CActiveRecord模型。对于HAS_MANY或MANY_TO_MANY,它将是CActiveRecord模型的数组。保存父模型时,不会保存这些模型。但是,由于它们确实是模型,因此您可以更新并保存这些单独的子模型。