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

时间:2015-07-03 11:12:42

标签: 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'
],

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

我还做了一个测试,看看它是否是模型中的东西,只是尝试通过提供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。

那么我做错了什么?

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

1 个答案:

答案 0 :(得分:4)

一般来说,有两种方法可以解决这个问题,

  • 通过传递带有请求数据的ID,正如您所知,要求实体中的ID字段为set as accessible,以便可以在修补过程中设置

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

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

我个人会推荐后一种方法,因为它不太可能存在陷阱,因为你不需要使ID可访问。我建议你在这里阅读: Preventing malicious users update data at add action

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