2013-06-24 208 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