【问题标题】:CakePHP 3, associated data being saved as new not updating?CakePHP 3,相关数据被保存为新的不更新?
【发布时间】:2015-07-03 11:12:41
【问题描述】:

更新

根据要求,这是我的表单中的$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 ....

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

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

$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 表中。

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

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

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

那我做错了什么?

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

【问题讨论】:

  • 您正在修补的请求数据是什么样的?
  • @ndm 问题已更新。
  • 好的,我已经成功了,但我不确定这是不是最好的方法。但是在我的地址实体中添加 'id' => true 到 'accessible' 似乎可以解决问题。
  • 取决于...您似乎使用Offices belongsTo Addresses 关联,对吗?如果是这样,是否还有Addresses hasMany Offices 关联?在不使用hasOne关联的情况下,您可以将地址与办公室一起编辑,这似乎有点奇怪。
  • @ndm 是的,我的code OfficeTable 属于地址code 和我的code 地址表有许多办公室code - 我还没有真正玩过CakePHP 烘焙的这些我在建立网站时。我的 SQL 知识有点薄弱,所以你是说我的关系设置错误?

标签: cakephp cakephp-3.0


【解决方案1】:

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

  • 通过将 ID 与请求数据一起传递,正如您所知道的,这要求实体中的 ID 字段为 set as accessible,以便可以在修补过程中进行设置

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

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

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

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

【讨论】:

  • 对不起,我最近几天不在。嗯,也许,我当时设计的这个数据库是错误的。每个办公室都将有一个标题、电话等和一个地址 ID,它们将链接到地址表。但是一个办公室永远只有一个地址,所以当最终用户编辑办公室时,他们需要编辑那个地址。我以这种方式制作地址表是因为用户可能在某个阶段有一个链接到他们的地址。我错了吗?
  • 我还要补充一点,我或多或少被要求让所有表格上的每个字段始终接受空数据,这样当保存一个新办公室时,唯一的将在我的表中创建一个新 ID。
  • 非常感谢。当我获取我的 Office 表时包含地址表,我可以看到没有任何问题。我确实认为我应该能够在不使我的 ID 可访问的情况下做到这一点。我非常不确定这样做。再次感谢。
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多