根据要求,这是形成我的表单的$this->request->data
,
'office' => 'LON-test33',
'phone' => '456456456',
'address' => [
'addline1' => '1 test0009 st',
'addline2' => 'p09987',
'addline3' => 'test9999',
'postcode' => 'p888',
'country_id' => '226'
],
所以办公室,电话都是我办公桌的一部分,地址是整个地址表。
我还做了一个测试,看看它是否是模型中的东西,只是尝试通过提供ID来更新地址表。哪个有效,所以我认为我的模型很好。所以我在考虑与Office模型有关或者我的代码有问题吗?
谢谢,
所以我正在使用CakePHP 3.0.something ....
我正在尝试将关联数据的地址更新到office表。但是,当我更新办公室时,地址被保存为一个完整的新记录?不确定为什么?
这是我到目前为止所做的事情,
$OfficeTable = TableRegistry::get('Offices');
$CurrentOffice = $OfficeTable->get($OfficeID);
$OfficeTable->patchEntity($CurrentOffice, $this->request->data, ['associated' => ['Addresses']]);
debug( $OfficeTable->save($CurrentOffice) );
在patchEntity中设置Associated
似乎没有区别,更新的地址已保存,但作为新记录。然后将此新记录ID放入' address_id'中的Office表中。领域。
但为什么要添加这个' new / edited'地址作为新记录而不更新相关的id记录?
现在我一直在阅读文档,并形成我理解的内容,如果无法找到记录,它会创建一个新记录吗?但是,我已经调试了保存电话,办公室和地址都有一个' [新]'设为false。那么为什么要更新我的办公室,但是当它告诉我它不是新的时,请创建一个新的地址?
所以要添加,在我的调试调用的底部有' [原创]'其中包含应更新的记录的旧地址ID。
那么我做错了什么?
如果我没有正确解释自己(我是阅读障碍者),那么请让我知道或者如果有任何遗漏我可以更新 - 谢谢
答案 0 :(得分:4)
一般来说,有两种方法可以解决这个问题,
通过传递带有请求数据的ID,正如您所知,要求实体中的ID字段为set as accessible,以便可以在修补过程中设置
或确保您要修补的实体中已存在该ID,例如在检索实体时包含关联
$CurrentOffice = $OfficeTable->get($OfficeID, [
'contain' => [
'Addresses'
]
]);
我个人会推荐后一种方法,因为它不太可能存在陷阱,因为你不需要使ID可访问。我建议你在这里阅读: Preventing malicious users update data at add action
话虽如此,您与办公室一起编辑地址的事实似乎有点奇怪,因为更改地址详细信息将会影响"所有办公室,所以通常不需要同时编辑这两个办公室。然而,这只是一个相当肤浅的问题,因为我不知道您的应用程序内部和要求。