2013-04-21 84 views
4

在模型測試的編輯頁面上我希望能夠更新與所有關聯(hasMany)問題關聯的「Questions.order」字段從相同的形式。CakePHP:如何使用表單助手同時更新多個記錄

我已經準備好了Cake book chapter on saveMany()/saveAll()的書,我使用Model.0.field syntax,但我無法弄清楚如何告訴CakePHP的記錄對應輸入其中。 #Model.#.field是否對應問題的ID字段?下面是目前我在做什麼:

echo $this->Form->create('Question', array('action'=>'order')); 

$n = 0; 
foreach ($questions_array as $question) : ?> 
     <?php echo $this->Form->input('Question.'.$n.'.order'); ?> 
     <?php echo $this->Form->input('Question.'.$n.'.id', array('type'=>'hidden', 'value'=>$question['Question']['id'])); ?> 
     <input type="submit" value="Save" /> 
... 
$n++; 
endforeach; 
$this->Question->Form->end(); 

的表單提交,似乎保存,但更新order值不符合正確的問題記錄。我究竟做錯了什麼?

更新

這裏是我的控制器的order行動:

public function admin_order() { 
    $data = $this->request->data; 
    $this->Question->saveAll($data['Question']); 
    $this->Session->setFlash("Order saved."); 
    $this->redirect($this->referer()); 
} 
+1

你增加$ n嗎? – Dave 2013-04-21 17:37:29

+1

什麼是「Qset」,它與您所描述的問題是否相符? – Dave 2013-04-21 17:39:29

+0

戴夫有一些很好的問題,我也看到你的表單在每一行都包含一個'提交'按鈕*(這應該不是問題,只是注意到了它)。你可以編輯你的問題並添加你的控制器代碼,看看你是如何保存你的數據的 – thaJeztah 2013-04-21 18:00:13

回答

4

CakePHP的同夥用相同的「索引」的所有字段在你的數據庫中的一個「記錄」。 '索引'(即0,Foo.0.id不是與記錄的'id'有任何關係,它只是一個數字。

例如;

Foo.0.id = 123 
Foo.0.name = 'hello'; 
Foo.1.id = 124 
Foo.1.name = 'world'; 

正如我的回答開始提到的那樣,本身沒有關係的指數,該代碼會做正是相同:

Foo.12345.id = 123 
Foo.12345.name = 'hello'; 
Foo.54321.id = 124 
Foo.54321.name = 'world'; 

只要相同記錄的字段有相同的'index',CakePHP會明白它們屬於'一起'。

提交此數據並保存使用時;

$this->Foo->saveMany($this->data['Foo']); // Just $this->data will probably work as well 

CakePHP通過Foo模型更新兩行;

table'foos';

id  name 
------------------------ 
123 hello 
124 world 

你的代碼似乎使用的每一行的相同「ID」($qset['Qset']['id']),這可能是不更新這些記錄

+0

在回顧你的回答和我的代碼後,我仍然不明白CakePHP知道爲$ this-> Form-> input('Question。 '。$ n。'。order');'我的理解是'$ n'用於將輸入「批量化」爲單個記錄,但CakePHP如何知道數據庫中的哪一行對應'$ n'? – emersonthis 2013-04-21 21:11:36

+0

@Emerson它知道哪個記錄要根據'id'字段進行更新; 'Foo.0.id = 123'和'Foo.0.name ='hello''因此會做類似'UPDATE foos SET name ='hello'WHERE id = 123;' – thaJeztah 2013-04-21 21:18:12

+0

我做了一個實驗。我在輸入的選項數組中添加了''value'=> $ question ['Question'] ['order']',現在所有的值都正確顯示。不知道爲什麼這有所作爲。 – emersonthis 2013-04-21 21:30:53

0
As we can see at CakePHP Book, the instruction is: 

// Create: id isn't set or is null 
$this->Recipe->create(); 
$this->Recipe->save($this->request->data); 

// **Update**: id is set to a numerical value 
$this->Recipe->id = 2; 
$this->Recipe->save($this->request->data); 

考慮到仍有權ID在2014年尋找答案的人 您必須在
查看:/ *(考慮$ n計數器)*/
$ this- >輸入( '問題'。$ N。 '順序。');
$ this-> input('Question。'。$ n。'。ID');
控制器:$ this-> Question-> updateAll - >($ this-> request-> data ['Question']);

相關問題