讓我們假設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。
在關係型數據庫中進行分型是不好玩的。
[隨時創建和銷燬關聯](http://book.cakephp.org/view/1045/Creating-and-Destroying-Associations-on-the-Fly) – deizel