CakePHP保存非常深的相关模型

时间:2014-07-11 02:10:16

标签: cakephp cakephp-2.3

我有一个使用Party分析模式来简化关联的数据库(因为它必须在人和组织上存储信息,两者都有共同的属性)。因此我的相关模型可以变得非常深。我的问题是保存数据的最佳方法是什么?例如,保存一个员工,Employee表没有直接连接到Party表,但是如果我将我的模型嵌入到这样的数组中:

array(
    'Party' => array(
        'Email' => array(...),
        'Address' => array(
            'Country' => array(...),
            'Location' => array(
                'State' => array(...)
            )
        ),
        'PhoneNumber' => array(...),
        'Person' => array(
            'Language' => array(...),
            'Skill' => array(...),
            'Employee' => array(
                'WorkHistory' => array(...),
                'Qualification' => array(...)
            )
        )
    )
)

我可以使用saveAll,它会保存所有内容。这意味着在我的表单上我有字段名称,例如Party.Person.Employee.start_time。但是有人告诉我这样做并不是真的遵循CakePHP惯例。另一种选择是让我的数组像这样:

array(
    'Party' => array(...)
    'Email' => array(...),
    'Address' => array(...),
    'Country' => array(...),
    'Location' => array(...),
    'PhoneNumber' => array(...),
    'Person' => array(...),
    'Language' => array(...),
    'Skill' => array(...),
    'Employee' => array(...),
    'WorkHistory' => array(...),
    'Qualification' => array(...)
)

但是,如果我在此调用saveAll,那么并不是所有内容都会被保存,因为某些表/模型没有直接连接到Party。保存这种结构的唯一方法就是使用事务。

所以我想知道CakePHP专家认为什么是处理需要保存非常深的相关模型的情况的最佳方法?

编辑:

根据我的反应,我可以收集的内容,对于您调用saveAll的模型,与其直接关联的其他模型不需要嵌套在该模型数组中。但是,如果您还想保存与其没有直接关联的模型,则需要将这些模型嵌套在与您调用saveAll的模型直接关联的模型中。对不起,我知道这令人困惑,所以这里是根据这些信息修改后的阵列结构:

array(
    'Party' => array(...),
    'Email' => array(...),
    'Address' => array(
        'Country' => 'attribute',
        'Location' => 'attribute',
        'State' => 'attribute'
    ),
    'PhoneNumber' => array(...),
    'Person' => array(
        'Language' => array(...),
        'Skill' => array(...),
        'Employee' => array(
            'WorkHistory' => array(...),
            'Qualification' => array(...)
        )
    )
)

人与党直接关联,因此不需要在党内嵌套。但是,Employee(一种Person)并不直接与Party相关联,因此,当它在Party上调用saveAll时保存Employee数据时,它需要嵌套在Person中,因为Person模型直接与Party关联。 (仅供参考:派对有一个人和一个人有一个员工。这是我可以想出在我的数据库中构建继承的最好方法)。通过这种方式构建它,应用程序既符合CakePHP标准,又以最小的努力保存数据。

1 个答案:

答案 0 :(得分:0)

嗯,解释有点在那里,它只是CakePHP的约定,而且我们都知道在不遵循约定时会发生什么,对吧?

正如我所说,遵循这些惯例可以帮助CakePHP自动将所有内容粘贴在一起,并且使用问题中显示的格式需要手动重新调整Model::find()来电所接收的数据。

因此,尽管您的问题中显示的结构可能适用于保存(至少目前为止),但它至少会为您带来一些实际上不必要的额外工作。

我承认我可能会更清楚,因为你似乎误解了我。我不想说数组应该是完全平坦的,只是错误放置的Person条目,所以我只提到了一个。

当然最终全部取决于关联类型,链接文档中的所有内容都有示例:Cookbook > Models > Saving Your Data

通常,只要没有任何HABTM关联来创建新记录而不是分配现有记录,您应该能够使用saveMany()saveAssociated()进行尽可能深的保存。

您可以参考Model::find()返回的结构开始,确保您保存在主模型上(在本例中为Party),并根据记录的关联/数量使用

  • save()(单条记录,无关联(HABTM除外))

  • saveAll()saveManysaveAssociated的包装)

  • saveMany()(多个主要模型记录,可能的关联(需要使用deep选项))

  • saveAssociated()(单个主要模型记录,包括关联(可能需要使用deep选项)

然而,这可能不适用于所有情况,如上所述,您可能会遇到HABTM关联问题,这取决于您是否要创建新记录,您可能需要单独保存它们,但这不是'这真的是解释每个可能情况的地方,特别是因为Cookbook已经涵盖了基础知识。

我建议您学习文档,坚持惯例,通过尝试学习,并查看核心资源和测试,这就是我们每个人都学习它的方式。当您遇到尚未涵盖的特定情况的问题时,只需创建一个新问题