Yii HAS_ONE关系不保存外键

时间:2013-06-24 13:17:23

标签: yii foreign-keys entity-relationship

我在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的想法,不是吗?

1 个答案:

答案 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模型的数组。保存父模型时,不会保存这些模型。但是,由于它们确实是模型,因此您可以更新并保存这些单独的子模型。