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

时间:2011-08-31 11:14:37

标签: php cakephp

什么不起作用

更新表单上,如果我更改复选框值,则这些 habtm值不会保存到数据库

在创建和更新表单中,我使用相同的方法:$this->Employee->save($this->data),它应该自动处理HABTM数据。

什么有效

我通过以下this tutorial成功设置了HABTM模型:员工拥有和贝隆语言语言(即指定哪个员工说哪种语言)。

我可以创建关系:在使用创建表单创建新员工时,检查员工知道并成功保存到数据库的任何语言:员工转到员工数据库表, language 的语言,关系转到 employee_language 表。

在编辑表单上,我会在创建员工时看到我检查了哪些checbox

我发现(可能)有罪

在评估创建和更新员工时数据库中的数据时,我发现$this->data变量结构不同。

在创建表单上(检查2种语言):

Create form

"$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   

在更新表格上(已检查其他语言,因此有3种语言):

Update form

"$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  

请注意,现在可以在$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"
            )
        )
  );
  ...
}

(model)language.php:

class Language extends AppModel {

  var $name = "Language";
  ...
}

(查看)admin_create.ctp(这是创建表单。此代码段呈现所有可用语言的复选框):

...
<?php  
    echo $form->input('Language',array(
        'label' => 'Speaks in languages:',
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $languages
));  ?>
...

(查看)admin_update.ctp(我可以看到我在创建员工时检查了哪些语言):

...
<?php  
    echo $form->input('Language',array(
        'label' => 'Speaks in languages:',
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $languages,
        'selected' => $html->value('Employee.Language')
));  ?>
...

1 个答案:

答案 0 :(得分:0)

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

  

...你不需要,你不应该在你的表格中使用“选中”   输入数组。

是的,当我删除“已选择”属性时,突然我能够对HABTM数据进行更新。 所以现在我的输入控件看起来像:

<?php  
    echo $form->input('Language',array(
        'label' => 'Speaks in languages:',
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $languages
));  ?>

没有办法将评论转换为答案,试图联系@mark发表他的评论作为答案,但没有采取任何行动,我正在回答我自己的问题,以便其他人可以看到这个问题有一个解。这就是meta:https://meta.stackexchange.com/questions/1555/mark-a-comment-as-answer-to-a-question/1558#1558

的建议