保存hasMany始终添加记录而不是更新

时间:2016-05-09 09:04:06

标签: php cakephp cakephp-3.2

我有一个hasMany关系(比方说Post hasMany Comments

我想同时修改Post和现有的Comment

我的代码

在我的评论edit.ctp文件中

<?= $this->Form->create($post); ?>
<?= $this->Form->input('title'); ?> 
<?= $this->Form->input('title');  ?>
<?= $this->Form->input('text'); ?>
<?= $this->Form->input('comments.0.id'); ?>
<?= $this->Form->input('comments.0.text'); ?>

并在我的PostsController

$post= $this->Posts->get($id);
$post= $this->Posts->patchEntity($post, $this->request->data, ['associated' => ['Comments']]);

我的问题

现在我希望评论会更新,而且每次都会添加新评论。

我做了什么

我尝试调试$this->request->data,我得到了

[
    'text' => 'This is a test',
    'comments' => [
        (int) 0 => [
            'id' => '168',
            'text' => 'Comment test',

        ]
    ]
]

但如果我调试$post我就

object(App\Model\Entity\Post) {

    /* ... */
    'comments' => [
        (int) 0 => object(App\Model\Entity\Comment) {

            'text' => 'Comment test',
            '[new]' => true,
            '[accessible]' => [
                '*' => true
            ],
            '[dirty]' => [
                'text' => true
            ],
            /* ... */

        }
    ],
    /* ... */
    '[dirty]' => [
        'comments' => true,
    ],

}   

那么,当我将id传递给控制器​​时,为什么评论被标记为'新'?

当然这是我实际情况的过度简化版本。也许问题不在上面的代码中,我必须在其他代码中寻找其他地方。

我的问题是,如果我正在做一些基本的方法错误。

1 个答案:

答案 0 :(得分:2)

您需要将相关数据读入您的实体以便能够对其进行修补,否则数据不会被合并,而只是编组,因此最终会被处理为&#34; new&# 34。

仅对特殊_ids密钥自动加载关联数据,并且当关联属性中至少有一个条目时,即实际上您不需要加载所需的关联数据修补,但必须有某些,以便编组人员到达正在读取和合并数据的位置。

确切地说,如果comments属性中没有任何数据,编组人员将会在这里离开

<强> https://github.com/cakephp/cakephp/blob/3.2.8/src/ORM/Marshaller.php#L653-L655

我无法确定是否存在错误,至少我猜这些文档需要更新,因为它们会有点误导。虽然他们确实试图解释当源实体中缺少关联数据时会发生什么,但是显示的示例目前不起作用,并且他们说只为belongsTo和{{1}创建新实体关联,这是不正确的。

<强> Cookbook > Database Access & ORM > Saving Data > Patching HasMany and BelongsToMany

您可能希望在GitHub上提出问题以便澄清。

TL;博士

长话短说,包含评论,你应该很好。

hasOne