CakePHP:如何使用表单帮助器同时更新多个记录

CakePHP:如何使用表单帮助器同时更新多个记录,php,cakephp,cakephp-2.0,cakephp-2.1,Php,Cakephp,Cakephp 2.0,Cakephp 2.1,在模型测试的编辑页面上,我希望能够更新来自同一表单的所有相关(由多个)问题上的“Questions.order”字段 我已经在书中准备好了,我正在使用Model.0.field语法,但我不知道如何告诉CakePHP哪个记录对应哪个输入。模型中的字段是否应与问题的id字段相对应?以下是我目前正在做的事情: echo $this->Form->create( 'Question', array('action'=>'order')); $n = 0; foreach ($que

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

我已经在书中准备好了,我正在使用
Model.0.field语法
,但我不知道如何告诉CakePHP哪个记录对应哪个输入。
模型中的
字段是否应与问题的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();

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

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->输入('Question.$n.'order')
$this->input('Question.$n..id')
控制器:$this->Question->updateAll->($this->request->data['Question'])


您是否在增加$n?什么是“Qset”以及它如何与您描述的问题相匹配?Dave有一些好问题,我还看到您的表单每行都包含一个“提交”按钮(这应该不是问题,只是注意到了)。你能回答你的问题并添加你的控制器代码,看看你是如何保存你的数据的吗data@Dave我将增加$n,很抱歉与“Qset”混淆。这是我班级的实际名称,但我想用问题来代替它,让它更清楚。这是一个复制/粘贴错误,我刚刚纠正了。@thaJeztah:是的,我故意在每个输入旁边包含一个提交按钮(因为表单可能很长)。我刚刚用控制器代码更新了问题。感谢在查看了您的答案和我的代码后,我仍然不明白CakePHP如何/为什么知道分配给
$this->Form->input('Question.$n.'order')的值
我的理解是,
$n
用于将输入“批处理”到单个记录中,但是CakePHP如何知道数据库中的哪一行对应于
$n
?@Emerson it知道根据“id”字段更新哪个记录
Foo.0.id=123
Foo.0.name='hello'
将执行类似于
updatefoos SET name='hello'的操作,其中id=123'value'=>$question['question']['order']
,现在所有的值都显示正确了。不知道为什么会有不同。刚才看到了你的评论。似乎就是这样。谢谢有必要这样做,这是否令人惊讶?我习惯于自动知道输入的值。是的,但是我理解,控制器中的
$this->request
是对视图中使用的相同请求对象的引用。为了演示,请在控制器中尝试以下操作:
$this->request->data['hello']='world'在您的视图中显示:
echo$this->request['hello']。FormHelper使用该数据自动填充输入值。如果请求对象包含正确格式的数据,则不必手动设置每个输入值。
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);