让我们假设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