2011-07-18 62 views
0

我有一個模型「目標」有四種類型的兒童(其中後者都具有不同的字段):CakePHP模型設計 - 更好的方法?

campaign_roi call_success phone_skill call_qluality

目標表包含指定一個字段,「模式」以上四種模式。

但是一個「目標」只有4個孩子中的一個。他們永遠不會有兩種類型的孩子。有沒有比爲每個孩子創建模型更好的方法?如果不是,我該如何動態指定哪個子類型的任何目標是?

例如,我想看到一個目標,它是小孩 - 在這種情況下是campaign_roi。我如何設置它在哪裏我可以做到這一點

$this->Goal->find('first', array(
    'conditions' => array(
     'Goal.id' => $id 
    ) 
) 

它從目標模型返回信息,它是兒童campaign_roi?

+0

[隨時創建和銷燬關聯](http://book.cakephp.org/view/1045/Creating-and-Destroying-Associations-on-the-Fly) – deizel

回答

0

讓我們假設4種類型的模型擁有無法合併爲單一類型的信息。也就是說,他們沒有共同點,除了他們都有一個goal_id並且是互斥的。我們假設這些模型中的任何一個的實例只能屬於一個目標。

您可以使用belongsTo關係和條件子句設置您的目標模型,以便它將嘗試加載每種類型的子項。

class Goal extends AppModel { 
    /* ... */ 

    var $belongsTo = array(
     'CampaignRoi' => array(
      'className' => 'CampaignRoi', 
      'conditions' => array('Goal.model' => 'CampaignRoi'), 
      'foreignKey' => 'model_id' 
     ), 
     'CallSuccess' => array(
      'className' => 'CallSuccess', 
      'conditions' => array('Goal.model' => 'CallSuccess'), 
      'foreignKey' => 'model_id' 
     ), 
     'PhoneSkill' => array(
      'className' => 'PhoneSkill', 
      'conditions' => array('Goal.model' => 'PhoneSkill'), 
      'foreignKey' => 'model_id' 
     ), 
     'CallQuality' => array(
      'className' => 'CallQuality', 
      'conditions' => array('Goal.model' => 'CallQuality'), 
      'foreignKey' => 'model_id' 
     ) 
    ); 

    /* ... */ 
} 

在您的目標表中,您將擁有模型字段和model_id字段。模型字段將填入CampaignRoi,CallSuccess,PhoneSkill或CallQuality。在您完成目標搜索後,您仍然需要檢查goal.model以確定需要使用哪種類型的孩子。

這是我多次使用的一種方法,雖然我不記得其他模型會發生什麼。在最壞的情況下,如果$ goal ['Goal'] ['model'] =='CallSuccess'),那麼它是一個空數組或字段(即empty($ goal ['CampaignRoi'])== true。

在關係型數據庫中進行分型是不好玩的。

0

對於模型繼承,我們可以用main_table_id創建sub_table來指向main_table。但是當你需要獲得完整的記錄時,這是相當複雜的。

如果這4個字段是孩子之間的唯一區別,那麼可以將它們全部放入目標表中。如果它們是相同的數據類型,則只能使用一個字段。您可以在模型中編寫自定義查找方法(findModel1(),...)或定義一個數組('model1name'=>'campaign_roi',...),以便稍後在find()時進行參考。

如何設計它實際上是魯棒性/可擴展性和便利性之間的折中。

0

難道你不能以另一種方式工作嗎?不是從目標的角度來看,而是從其他角度來看?

不要在目標模型中指定任何關係,在CampaignRoi,CallSuccess,PhoneSkill和CallQuality中指定hasOne關係。

通過CampaignRoi,CallSuccess,PhoneSkill和CallQuality進行查詢。