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'
        ]
    ]);
    
就我个人而言,我建议使用后一种方法,因为它不太可能存在陷阱,因为您不需要访问ID。我建议您在这里阅读:


话虽如此,您与办公室一起编辑地址的事实似乎有点奇怪,因为更改地址详细信息将“影响”所有办公室,因此通常不需要同时编辑这两个地址。不过,这只是一个相当肤浅的问题,因为我不知道您的应用程序内部和要求。

您正在修补的请求数据是什么样子的?@ndm问题已更新。好的,我已经让它工作了,但我不确定这是最好的方法。但将'id'=>true添加到我的地址实体中的'accessible',似乎可以解决这个问题。具体取决于。。。您似乎使用了
办公室地址
关联,对吗?如果是这样的话,是否还有一个
地址与多个办公室的关联?在不使用
hasOne
关联的情况下,您可以与办公室一起编辑地址,这似乎有点奇怪。@ndm是的,没错,我的
code
OfficeTable属于地址
code
,我的
code
AddressTable有许多办公室
code
——我还没有真正玩过CakePHP在我建立网站时为我烤的东西。我的SQL知识有点薄弱,所以你是说我的关系设置错误吗?对不起,我最近几天不在。嗯,也许,当时我把这个数据库设计错了。每个办公室将有一个标题、电话等和一个addressID,该ID将链接到地址表中。但是一个办公室只有一个地址,因此当最终用户编辑办公室时,他们需要编辑该地址。我这样做地址表是为了用户可能在某个阶段有一个地址链接到他们。我错了吗?我还要补充一点,我或多或少地被要求将所有表上的每个字段始终设置为accpect null数据,这样,当保存一个新办公室时,唯一要做的就是在我的表中设置一个新ID。非常感谢。在获取Office表时包含地址表不会出现任何问题。我确实认为,我应该能够做到这一点,而不让我的身份证访问。我对这样做很不确定。再次感谢。