我有一个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
传递给控制器时,为什么评论被标记为'新'?
当然这是我实际情况的过度简化版本。也许问题不在上面的代码中,我必须在其他代码中寻找其他地方。
我的问题是,如果我正在做一些基本的方法错误。
答案 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上提出问题以便澄清。
长话短说,包含评论,你应该很好。
hasOne