2013-06-24 131 views
0

Yii框架中的HAS_ONE关系有问题。该方案是如下: 我们有一个用户类关系SubscriptionType:Yii HAS_ONE关系不保存外键

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

和S SubscriptioType与有关用户:

'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_type_id不是,所以INSERT查询抛出违反约束。 我是否必须明确设置subscription_type_id?它对我来说没有什么意义,因为它违背了ORM的想法,不是吗?

回答

2

我认为你错误地定义了关系。 HAS_ONE用于One-to-One关系的Parent端,而HAS_MANY用于一对多关系的Parent端。你需要一个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模型。保存父模型时不会保存这些模型。但是,由于它们确实是模型,因此您可以更新并保存这些单独的子模型。

+0

嗨!谢谢你的评论。我改变了与BELONGS_TO的关系,这是有道理的。但你能解释我一件事吗。你的意思是我总是必须手动设置其他相关模型的subscription_type_id和其他ID?那么在关系()中定义的CActiveRecord字段总是只读的?我不太喜欢这种方法:/ – Mat

+0

使用$ newUser-> subscription_type_id = $ subscription-> id。在User模型上设置subscriptionType关系不会自动设置User模型本身的任何属性。 – jmarkmurphy

+0

感谢您的回答,我现在就做,但我仍然不喜欢这种做法:(无论如何,谢谢! – Mat