Yii有一个关系不';不保存外键

Yii有一个关系不';不保存外键,yii,foreign-keys,entity-relationship,Yii,Foreign Keys,Entity Relationship,我对Yii框架中的HAS_ONE关系有问题。情况如下: 我们有一个与SubscriptionType相关的用户类: 'subscriptionType' => array(self::HAS_ONE, 'SubscriptionType', 'subscription_type_id') 和与用户相关的s SubscriptionType: 'users' => array(self::HAS_MANY, 'User', 'subscription_type_id') 此外,用户

我对Yii框架中的HAS_ONE关系有问题。情况如下: 我们有一个与SubscriptionType相关的用户类:

'subscriptionType' => array(self::HAS_ONE, 'SubscriptionType', 'subscription_type_id')
和与用户相关的s SubscriptionType:

'users' => array(self::HAS_MANY, 'User', 'subscription_type_id')
此外,用户还有一个数据库中定义的SubscriptionType外键

预定义了3种订阅类型,所有注册用户在注册期间默认获得其中一种。它们保存在数据库中,因此在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\u type\u id未分配,因此INSERT查询抛出了约束冲突。
我是否必须显式设置订阅类型id?这对我来说没有多大意义,因为它违背了ORM的理念,不是吗?

我认为你对关系的定义不正确。HAS_ONE表示一对一关系的父方,HAS_MANY表示一对多关系的父方。你需要在其中一个关系中的子关系上有一个属于你的关系。我猜您的用户模型应该具有如下所示的属性:

'subscriptionType' => array(self::BELONGS_TO, 'SubscriptionType', 'subscription_type_id')

您遇到的另一个问题是,当subscribionType更像是一个只读属性(由框架填充)时,您正在尝试为它分配一个值。如果是HAS\u ONE或a belown\u,这将是一个CActiveRecord模型。在HAS_MANY或MANY_TO_MANY的情况下,它将是一组CActiveRecord模型。保存父模型时不会保存这些模型。但是,由于它们确实是模型,您可以更新和保存这些单独的子模型。

Hi!谢谢你的评论。我把关系改成了“属于”,这是有道理的。但你能给我解释一件事吗。你的意思是我总是必须手动设置订阅类型id和其他相关型号的其他id?那么relations()中定义的CActiveRecord字段始终是只读的?我不太喜欢这种方法:/Use$newUser->subscription\u type\u id=$subscription->id。在用户模型上设置subscriptionType关系不会自动设置用户模型本身的任何属性。谢谢你的回答,我现在就做,但我仍然不喜欢这种方法:(无论如何,谢谢!