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

Model view controller CakePHP模型设计-更好的方法?,model-view-controller,cakephp,data-modeling,Model View Controller,Cakephp,Data Modeling,我有一个模型“目标”,它有四种类型的孩子(都有不同的领域): 投资回报率 称你成功 电话技巧 呼叫QLITY 目标表包含一个字段“model”,指定上述四种模型之一 但是一个“目标”只有四个孩子中的一个。他们永远不会有两种类型的孩子。有没有比为每个孩子创建模型更好的方法?如果不是,我如何动态地指定任何目标的子类型 例如,我想看到一个目标和它的孩子-在这种情况下,一个活动的投资回报率。我怎样才能把它设置在我能做的地方 $this->Goal->find('first', array(

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

投资回报率 称你成功 电话技巧 呼叫QLITY

目标表包含一个字段“model”,指定上述四种模型之一

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

例如,我想看到一个目标和它的孩子-在这种情况下,一个活动的投资回报率。我怎样才能把它设置在我能做的地方

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

它从目标模型及其子活动的roi返回信息。

对于模型继承,我们可以使用主表id创建子表,以指向主表。但是当你需要一个完整的记录时,这是相当复杂的

如果这4个字段是子项之间的唯一区别,则可以将它们全部放在目标表中。如果它们是相同的数据类型,您可以只使用一个字段。您可以在模型中编写自定义查找方法(findModel1(),…)或定义数组('model1name'=>'campaign_roi',…),以便以后查找()时方便参考


如何设计它实际上是稳健性/可扩展性和方便性之间的折衷。

让我们假设这4种类型的模型包含无法合并为单一类型的信息。也就是说,它们没有共同点,只是它们都有一个目标,并且相互排斥。让我们假设这些模型中任何一个的实例只能属于一个目标

可以使用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'
        )
    );

    /* ... */
}
在目标表中,您将有模型字段和模型id字段。模型字段将填充活动ROI、CallSuccess、PhoneSkill或CallQuality。在完成对目标的查找之后,您仍然需要检查Goal.model以确定需要与哪种类型的孩子一起工作

这是一种我已经使用过好几次的方法,尽管我不太记得其他模型会发生什么。在最坏的情况下,它是一个空数组或字段(即空($goal['campaintroi'])==true,如果$goal['goal']['model']==CallSuccess')


关系数据库中的子类型从来都不是一件有趣的事情。

难道你不能用另一种方式工作吗?不是从目标的角度,而是从其他角度

不要在目标模型中指定无关系,在活动ROI、CallSuccess、PhoneSkill和CallQuality中指定hasOne关系

通过CampaignRoi、CallSuccess、PhoneSkill和CallQuality进行查询