CakePHP模型设计 - 更好的方法?

时间:2011-07-18 21:50:06

标签: model-view-controller cakephp data-modeling

我有一个模型“目标”,它有四种类型的孩子(都有不同的字段):

campaign_roi call_success phone_skill call_qluality

目标表包含一个字段“模型”,它指定上述四种模型中的一种。

但是一个“目标”只有4个孩子中的一个。他们永远不会有两种类型的孩子。有没有比为每个孩子创建模型更好的方法?如果没有,我如何动态指定任何目标是哪种子类型?

例如,我希望看到一个目标而且它是孩子 - 在这种情况下是campaign_roi。如何在可以执行此操作的地方进行设置

$this->Goal->find('first', array(
   'conditions' => array(
      'Goal.id' => $id
   )
)

它会返回目标模型中的信息及其子广告系列_roi?

3 个答案:

答案 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进行查询。