我有一个使用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 . 保存这种结构的唯一方法就是使用Transactions .
所以我想知道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关联 . (仅供参考:Party有一个人和一个人有一个员工 . 这是我在数据库中构建继承结构的最好方法) . 通过这种方式构建它,应用程序既符合CakePHP标准,又以最小的努力保存数据 .
1 回答
好吧,解释有点在那里,它只是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已经涵盖了基础知识 .我建议你学习文档,坚持惯例,通过尝试学习,并查看核心资源和测试,这就是我们每个人都学习它的方式 . 当你遇到问题时尚未涵盖的具体情况,只需创建一个新问题