可以插入HABTM数据但无法更新吗?

Jan*_*rgs 5 php cakephp

什么行不通

更新表单上,如果我更改复选框值,这些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)

Jan*_*rgs 0

马克在评论中提供了解决问题的答案:

...您不需要也不应该在表单输入数组中使用“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