0

Yii フレームワークの HAS_ONE 関係に問題があります。シナリオは次のとおりです。SubscriptionType に関連する User クラスがあります。

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

User に関連する 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の考え方に反するので、あまり意味がありませんね。

4

1 に答える 1

2

関係を正しく定義していないと思います。HAS_ONE は 1 対 1 の関係の親側用であり、HAS_MANY は 1 対多の関係の親側用です。リレーションシップの子側にある必要があるこれらの 1 つに BELONGS_TO が必要です。ユーザーモデルには、次のような BELONGS_TO が必要だと思います。

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

あなたが抱えているもう1つの問題は、フレームワークによって入力されるという点で読み取り専用属性に似ている場合に、 subscripionType に値を割り当てようとしていることです。HAS_ONE または BELONGS_TO の場合、これは CActiveRecord モデルになります。HAS_MANY または MANY_TO_MANY の場合、CActiveRecord モデルの配列になります。親モデルを保存しても、これらのモデルは保存されません。ただし、これらは実際にはモデルであるため、これらの個々の子モデルを更新して保存できます。

于 2013-06-24T17:55:21.723 に答える