0

Yii 框架中的 HAS_ONE 关系有问题。场景如下:我们有一个与 SubscriptionType 相关的 User 类:

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

和与用户相关的 SubscriptioType:

'users' => array(self::HAS_MANY, 'User', 'subscription_type_id')

更重要的是,用户在数据库中定义了订阅类型的外键。

预定义了 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 的想法,不是吗?

4

1 回答 1

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

于 2013-06-24T17:55:21.723 回答