假设这 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 字段和 model_id 字段。模型字段将填充 CampaignRoi、CallSuccess、PhoneSkill 或 CallQuality。在 Goal 上完成查找后,您仍需要检查 goal.model 以确定您需要使用哪种类型的孩子。
这是我多次使用的方法,但我不太记得其他模型发生了什么。在最坏的情况下,它是一个空数组或字段(即 empty($goal['CampaignRoi']) == true, if $goal['Goal']['model'] == 'CallSuccess')。
关系数据库中的子类型从来都不是一件有趣的事情。