CakePHP 3,关联数据被保存为新数据而不是更新? 更新
根据请求,这是构成我的表单的CakePHP 3,关联数据被保存为新数据而不是更新? 更新,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,根据请求,这是构成我的表单的$this->request->data 'office' => 'LON-test33', 'phone' => '456456456', 'address' => [ 'addline1' => '1 test0009 st', 'addline2' => 'p09987', 'addline3' => 'test9999', 'postcode' => 'p888', 'count
$this->request->data
'office' => 'LON-test33',
'phone' => '456456456',
'address' => [
'addline1' => '1 test0009 st',
'addline2' => 'p09987',
'addline3' => 'test9999',
'postcode' => 'p888',
'country_id' => '226'
],
所以办公室、电话是我办公桌的一部分,地址就是整个地址表
我还做了一个测试,看看它是否在模型中,通过提供一个ID来更新地址表。这很有效,所以我认为我的模型很好。所以我想要么与Office模型有关,要么我的代码有问题
谢谢
所以我使用的是CakePHP3.0.something 我正在尝试更新与office表关联的数据的地址。然而,当我更新办公室时,地址被保存为一个完整的新记录?不知道为什么 以下是我目前正在做的事情
$OfficeTable = TableRegistry::get('Offices');
$CurrentOffice = $OfficeTable->get($OfficeID);
$OfficeTable->patchEntity($CurrentOffice, $this->request->data, ['associated' => ['Addresses']]);
debug( $OfficeTable->save($CurrentOffice) );
在patchEntity中设置关联的
似乎没有什么区别,更新后的地址将被保存,但作为新记录保存。然后将此新记录ID放入“address_ID”字段中的Office表中
但为什么要将这个“新的/编辑的”地址添加为新记录,而不更新相关的id记录
现在我一直在看文件,从我的理解来看,如果找不到记录,它会做一个新的记录吗?但是,我已经调试了save调用,在office和address上有一个“[new]”设置为false。那么,为什么要更新我的办公室,但当它告诉我它不是新的时,却要创建一个新地址呢
因此,要添加的是,在调试调用的底部有“[original]”,它包含它应该更新的记录的旧地址id
那么我做错了什么
如果我没有正确解释自己(我是诵读困难症患者),那么请告诉我,或者如果遗漏了什么,我可以更新-谢谢通常有两种方法可以解决这个问题
- 或者通过将ID与请求数据一起传递,正如您所了解的,这需要ID字段位于实体中,以便可以在修补过程中进行设置
- 或者通过确保要修补的实体中已经存在该ID,例如在检索实体时包含关联
$CurrentOffice = $OfficeTable->get($OfficeID, [ 'contain' => [ 'Addresses' ] ]);
话虽如此,您与办公室一起编辑地址的事实似乎有点奇怪,因为更改地址详细信息将“影响”所有办公室,因此通常不需要同时编辑这两个地址。不过,这只是一个相当肤浅的问题,因为我不知道您的应用程序内部和要求。您正在修补的请求数据是什么样子的?@ndm问题已更新。好的,我已经让它工作了,但我不确定这是最好的方法。但将'id'=>true添加到我的地址实体中的'accessible',似乎可以解决这个问题。具体取决于。。。您似乎使用了
办公室地址关联,对吗?如果是这样的话,是否还有一个地址与多个办公室的关联?在不使用hasOne
关联的情况下,您可以与办公室一起编辑地址,这似乎有点奇怪。@ndm是的,没错,我的code
OfficeTable属于地址code
,我的code
AddressTable有许多办公室code
——我还没有真正玩过CakePHP在我建立网站时为我烤的东西。我的SQL知识有点薄弱,所以你是说我的关系设置错误吗?对不起,我最近几天不在。嗯,也许,当时我把这个数据库设计错了。每个办公室将有一个标题、电话等和一个addressID,该ID将链接到地址表中。但是一个办公室只有一个地址,因此当最终用户编辑办公室时,他们需要编辑该地址。我这样做地址表是为了用户可能在某个阶段有一个地址链接到他们。我错了吗?我还要补充一点,我或多或少地被要求将所有表上的每个字段始终设置为accpect null数据,这样,当保存一个新办公室时,唯一要做的就是在我的表中设置一个新ID。非常感谢。在获取Office表时包含地址表不会出现任何问题。我确实认为,我应该能够做到这一点,而不让我的身份证访问。我对这样做很不确定。再次感谢。