2011-07-18 54 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进行查询。