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

use*_*505 2 cakephp cakephp-3.0

更新

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

'office' => 'LON-test33',
'phone' => '456456456',
'address' => [
    'addline1' => '1 test0009 st',
    'addline2' => 'p09987',
    'addline3' => 'test9999',
    'postcode' => 'p888',
    'country_id' => '226'
],
Run Code Online (Sandbox Code Playgroud)

所以办公室,电话是我办公室表的一部分,地址是整个地址表。

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

谢谢,


所以我正在使用 CakePHP 3.0.something ....

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

这是我目前正在做的事情,

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

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

debug( $OfficeTable->save($CurrentOffice) );
Run Code Online (Sandbox Code Playgroud)

Associated在 patchEntity 中设置似乎没有什么区别,更新后的地址被保存,而是作为新记录。然后将此新记录 ID 放入 Office 表的“address_id”字段中。

但是为什么要将这个“新的/编辑过的”地址添加为新记录而不更新关联的 id 记录?

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

所以要补充的是,在我的调试调用的底部有一个 '[original]',它包含它应该更新的记录的旧地址 ID。

那么我做错了什么?

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

ndm*_*ndm 5

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

  • 或者通过将 ID 与请求数据一起传递,正如您所发现的,这需要将 ID 字段设置为实体中可访问的字段,以便可以在修补过程中进行设置

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

    $CurrentOffice = $OfficeTable->get($OfficeID, [
        'contain' => [
            'Addresses'
        ]
    ]);
    
    Run Code Online (Sandbox Code Playgroud)

我个人会推荐后一种方法,因为它可能存在的陷阱较少,因为您不需要使 ID 可访问。我建议您在此处阅读:防止恶意用户在添加操作时更新数据

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