在更新表单上,如果我更改复选框值,这些habtm值不会保存到数据库.
在创建和更新表单中,我使用相同的方法:$this->Employee->save($this->data)它应该自动处理HABTM数据.
我按照本教程成功建立了HABTM模型:Employees hasAndBelongsToMany Languages(即指定哪个员工说哪种语言).
我可以创建关系:创建与创建表单新员工时,检查哪些员工都知道任何语言,它成功地保存到数据库:员工进入员工数据库表,语言的语言和关系去employee_language表.
在编辑表单上,我看到我在创建员工时检查了哪些checbox.
在评估创建和更新员工时数据库中的数据时,我发现$this->data变量结构不同.
在创建表单上(检查2种语言):

"$this->data" Array [2]
Employee Array [6]
name_lv John Doe
position_lv Computer administrator
enabled 0
Language Array [1]
Language Array [2]
0 1
1 5
Run Code Online (Sandbox Code Playgroud)
在更新表格(检查其他语言,所以3种语言):

"$this->data" Array [1]
Employee Array [8]
name_lv John Doe
position_lv Computer administrator
Language Array [3]
0 1
1 5
2 4
enabled 0
id 68
Run Code Online (Sandbox Code Playgroud)
请注意,语言现在可以$this->data["Employee"]["Language"]在创建时访问$this->data["Language"]
如果我这样做,$this->data["Language"] = $this->data["Employee"]["Language"];则值保存(yay),但employee_language HABTM表中存在重复的条目(哦不).
那么我切换哪个开关使我的复选框可更新?
(型号)employee.php
class Employee extends AppModel {
var $name = "Employee";
var $hasAndBelongsToMany = array (
"Language" =>
array(
"className" => "Language",
"conditions" => array(
"Language.enabled" => "1"
)
)
);
...
}
Run Code Online (Sandbox Code Playgroud)
(型号)language.php:
class Language extends AppModel {
var $name = "Language";
...
}
Run Code Online (Sandbox Code Playgroud)
(查看)admin_create.ctp(这是创建表单.此代码段呈现所有可用语言的复选框):
...
<?php
echo $form->input('Language',array(
'label' => 'Speaks in languages:',
'type' => 'select',
'multiple' => 'checkbox',
'options' => $languages
)); ?>
...
Run Code Online (Sandbox Code Playgroud)
(查看)admin_update.ctp(我可以看到我在创建员工时检查了哪些语言):
...
<?php
echo $form->input('Language',array(
'label' => 'Speaks in languages:',
'type' => 'select',
'multiple' => 'checkbox',
'options' => $languages,
'selected' => $html->value('Employee.Language')
)); ?>
...
Run Code Online (Sandbox Code Playgroud)
马克在评论中提供了解决问题的答案:
...您不需要也不应该在表单输入数组中使用“selected”。
是的,当我删除“选定”属性时,突然我能够对 HABTM 数据进行更新。所以现在我的输入控件看起来像:
<?php
echo $form->input('Language',array(
'label' => 'Speaks in languages:',
'type' => 'select',
'multiple' => 'checkbox',
'options' => $languages
)); ?>
Run Code Online (Sandbox Code Playgroud)
没有办法将评论转换为答案,尝试联系@mark以发布他的评论作为答案,但没有采取任何行动,我正在回答我自己的问题,以便其他人可以看到这个问题有解决方案。这就是元上的建议: https://meta.stackexchange.com/questions/1555/mark-a-comment-as-answer-to-a-question/1558#1558