2016-05-09 31 views
1

我有一個hasMany關係記錄(假設Post的hasMany Comments節約的hasMany隨時補充,而不是更新

我想同時編輯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

您需要將相關數據讀入您的實體以便能夠修補它,否則數據將不會合並,但只是編組,因此最終被處理爲「新」。

自動加載關聯數據只發生在特殊_ids鍵上,並且關聯屬性中至少有一個條目時,即實際上不需要加載要修補的關聯數據,但是在那裏必須是,以便編組人員能夠達到正在讀取和合並數據的點。

確切的說,無需在comments財產的任何數據,編組將走出這裏

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

我真的不能告訴是否有可能是一個錯誤,至少是我猜這些文檔需要更新,因爲它們會有點誤導。雖然他們試圖解釋在源實體中缺少關聯數據時會發生什麼情況,但顯示的示例目前不起作用,並且他們說只會爲belongsTohasOne關聯創建新實體,這是不正確的。

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

您可能希望通過在GitHub上提交的問題進行澄清。

tl; dr

長話短說,包含評論,你應該是好的。

$post = $this->Posts->get($id, [ 
    'contain' => ['Comments'] 
]); 
// ... 
+1

謝謝,它效果很好。不僅手冊的這一部分令人困惑,而且[這一個](http://book.cakephp.org/3.0/en/views/helpers/form.html#creating-inputs-for-associated-data)imho 。 – arilia

+1

@arilia如果這個例子包含了讀取數據的代碼,假設你真的需要讀取數據,這肯定會有幫助,而這不是一個錯誤。 – ndm

+0

@arilia我在'cakephp/docs'上打開了一個問題。 ** https://github.com/cakephp/docs/issues/3952** – ndm