CakePHP 3,相关数据被保存为新的不更新?

CakePHP 3, associated data being saved as new not updating?

更新

根据要求,这是我的表格 $this->request->data

'office' => 'LON-test33',
'phone' => '456456456',
'address' => [
    'addline1' => '1 test0009 st',
    'addline2' => 'p09987',
    'addline3' => 'test9999',
    'postcode' => 'p888',
    'country_id' => '226'
],

所以办公室 phone 是我办公室 table 的一部分,地址是整个地址 table。

我也做了一个测试,看看它是否是模型中的东西,只是尝试通过提供一个 ID 来更新地址 table。哪个有效,所以我认为我的模型很好。所以我在想与 Office 模型有关还是我的代码有问题?

谢谢,


所以我正在使用 CakePHP 3。0.something ....

我正在尝试更新我的地址,该地址是与办公室相关的数据 table。但是,当我更新办公室时,地址会另存为一个全新的记录吗?不知道为什么?

这是我目前所做的,

$OfficeTable = TableRegistry::get('Offices');
$CurrentOffice = $OfficeTable->get($OfficeID);

$OfficeTable->patchEntity($CurrentOffice, $this->request->data, ['associated' => ['Addresses']]);

debug( $OfficeTable->save($CurrentOffice) );

在patchEntity中设置Associated似乎没有什么区别,更新的地址被保存了,但是作为一个新的记录。然后将这个新记录 ID 放入 Office table 的 'address_id' 字段中。

但为什么将此 'new/edited' 地址添加为新记录而不更新关联的 id 记录?

现在一直在看文档,按照我的理解,如果找不到记录会重新记录吗?但是,我已经调试了保存调用,并且在办公室和地址上都有一个设置为 false 的“[new]”。那么为什么要更新我的办公室,却在告诉我它不是新地址时创建一个新地址?

所以要补充一点,在我的调试调用底部有“[原始]”,其中包含它应该更新的记录的旧地址 ID。

那我做错了什么?

如果我没有正确解释自己(我有阅读障碍),请告诉我,或者如果有任何遗漏我可以更新 - 谢谢

通常有两种方法可以解决这个问题,

  • 通过将 ID 与请求数据一起传递,如您所知,实体中的 ID 字段必须为 set as accessible,以便可以在补丁进程

  • 或者通过确保 ID 已经存在于您要修补的实体中,例如通过在检索实体时包含关联

    $CurrentOffice = $OfficeTable->get($OfficeID, [
        'contain' => [
            'Addresses'
        ]
    ]);
    

就我个人而言,我会推荐后一种方法,因为它不太可能出现陷阱,因为您不需要使 ID 可访问。我建议您在这里阅读:

话虽如此,您同时编辑地址和办公室这一事实似乎有点奇怪,因为更改地址详细信息会 "affect" 所有办公室,因此通常不需要同时编辑两者同时。然而,这只是一个相当肤浅的问题,因为我不了解您的应用程序的内部结构和要求。