5

在模型测试的编辑页面上,我希望能够更新来自同一表单的所有相关(通过 hasMany)问题的“Questions.order”字段。

我已经准备好书中关于 saveMany()/saveAll() 的 Cake book 章节,我正在使用Model.0.field syntax但我不知道如何告诉 CakePHP哪个记录对应于哪个输入。#in是否应该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() );
}
4

2 回答 2

4

CakePHP 将所有具有相同“索引”的字段关联为数据库中的单个“记录”。'index'(即0in 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';

只要同一记录的字段具有相同的“索引”,CakePHP 就会理解它们属于“一起”。

提交此数据并使用保存时;

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

CakePHP 通过Foo模型更新两行;

表'foos';

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

您的代码似乎对每一行使用相同的“id”($qset['Qset']['id']),这可能不是更新这些记录的正确 ID

于 2013-04-21T18:08:50.860 回答
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);

考虑到 2014 年仍有人在寻找这个答案,您必须在
视图中使用:/*(考虑到 $n 计数器)*/
$this->input('Question.'.$n.'.order');
$this->input('问题。'.$n.'.id');
控制器:$this->Question->updateAll->($this->request->data['Question']);

于 2014-03-14T16:15:06.443 回答