我有一个使用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标准,又以最小的努力保存数据。
答案 0 :(得分:0)
嗯,解释有点在那里,它只是CakePHP的约定,而且我们都知道在不遵循约定时会发生什么,对吧?
正如我所说,遵循这些惯例可以帮助CakePHP自动将所有内容粘贴在一起,并且使用问题中显示的格式需要手动重新调整Model::find()
来电所接收的数据。
因此,尽管您的问题中显示的结构可能适用于保存(至少目前为止),但它至少会为您带来一些实际上不必要的额外工作。
我承认我可能会更清楚,因为你似乎误解了我。我不想说数组应该是完全平坦的,只是错误放置的Person
条目,所以我只提到了一个。
当然最终全部取决于关联类型,链接文档中的所有内容都有示例:Cookbook > Models > Saving Your Data
通常,只要没有任何HABTM关联来创建新记录而不是分配现有记录,您应该能够使用saveMany()
或saveAssociated()
进行尽可能深的保存。
您可以参考Model::find()
返回的结构开始,确保您保存在主模型上(在本例中为Party
),并根据记录的关联/数量使用
save()
(单条记录,无关联(HABTM
除外))
saveAll()
(saveMany
和saveAssociated
的包装)
saveMany()
(多个主要模型记录,可能的关联(需要使用deep
选项))
或saveAssociated()
(单个主要模型记录,包括关联(可能需要使用deep
选项)
然而,这可能不适用于所有情况,如上所述,您可能会遇到HABTM
关联问题,这取决于您是否要创建新记录,您可能需要单独保存它们,但这不是'这真的是解释每个可能情况的地方,特别是因为Cookbook已经涵盖了基础知识。
我建议您学习文档,坚持惯例,通过尝试学习,并查看核心资源和测试,这就是我们每个人都学习它的方式。当您遇到尚未涵盖的特定情况的问题时,只需创建一个新问题