【问题标题】:CakePHP model design - better way?CakePHP 模型设计 - 更好的方法?
【发布时间】:2011-07-19 19:25:25
【问题描述】:

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

campaign_roi call_success 电话技能 call_qluality

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

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

例如,我想查看一个目标,它是子目标——在本例中是一个campaign_roi。我该如何设置它,我可以做到这一点

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

它返回来自目标模型的信息,它是子campaign_roi?

【问题讨论】:

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


【解决方案1】:

假设这 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')。

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

【讨论】:

    【解决方案2】:

    对于模型继承,我们可以使用 main_table_id 创建 sub_table 以指向 main_table。但是,当您需要获得完整记录时,这非常复杂。

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

    您如何设计它实际上是健壮性/可扩展性和便利性之间的权衡。

    【讨论】:

      【解决方案3】:

      你不能反过来做吗?不是从目标的角度,而是从其他的角度?

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        • 2015-01-05
        • 2011-01-22
        • 1970-01-01
        相关资源
        最近更新 更多