我有一个模型“目标”,它有四种类型的孩子(都有不同的字段):
campaign_roi call_success phone_skill call_qluality
目标表包含一个字段“模型”,它指定上述四种模型中的一种。
但是一个“目标”只有4个孩子中的一个。他们永远不会有两种类型的孩子。有没有比为每个孩子创建模型更好的方法?如果没有,我如何动态指定任何目标是哪种子类型?
例如,我希望看到一个目标而且它是孩子 - 在这种情况下是campaign_roi。如何在可以执行此操作的地方进行设置
$this->Goal->find('first', array(
'conditions' => array(
'Goal.id' => $id
)
)
它会返回目标模型中的信息及其子广告系列_roi?
答案 0 :(得分:0)
对于模型继承,我们可以使用main_table_id创建sub_table以指回main_table。但是当你需要获得完整的记录时,这是非常复杂的。
如果4个字段是孩子们之间的唯一区别,则可以将它们全部放在目标表中。如果它们是相同的数据类型,则只能使用一个字段。您可以在模型中编写自定义查找方法(findModel1(),...)或定义数组('model1name'=>'campaign_roi',...),以便稍后在执行find()时轻松参考。
如何设计它实际上是在稳健性/可扩展性和便利性之间的权衡。
答案 1 :(得分:0)
假设4种类型的模型包含无法合并到单一类型的信息。也就是说,它们没有共性,除了它们都有一个goal_id并且是互斥的。让我们假设这些模型中任何一个模型的实例只能属于一个目标。
您可以使用belongsTo关系和conditions子句设置目标模型,以便它会尝试加载每种类型的子项。
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 ['CampaignRoi'])== true,如果$ goal ['Goal'] ['model'] =='CallSuccess')。
关系数据库中的子类型输入永远不会有趣。
答案 2 :(得分:0)
你不能以相反的方式工作吗?不是从目标的角度来看,而是来自其他人?
不要在目标模型中指定任何关系,在CampaignRoi,CallSuccess,PhoneSkill和CallQuality中指定hasOne关系。
通过CampaignRoi,CallSuccess,PhoneSkill和CallQuality进行查询。