Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 可以插入HABTM数据但无法更新? 什么不起作用_Php_Cakephp - Fatal编程技术网

Php 可以插入HABTM数据但无法更新? 什么不起作用

Php 可以插入HABTM数据但无法更新? 什么不起作用,php,cakephp,Php,Cakephp,在更新表单上,如果我更改复选框值,这些habtm值不会保存到数据库 尽管在创建和更新表单时我使用了相同的方法:$this->Employee->save($this->data),它应该会自动处理HABTM数据 什么有效 I`v通过以下方式成功地建立了HABTM模型:员工拥有多种语言(即指定哪名员工使用哪种语言) 我可以创建关系:使用创建表单创建新员工时,检查员工知道的任何语言并成功保存到数据库:员工转到员工数据库表,语言到语言,关系转到员工语言表 在编辑表单上,我看到在创建员工时选中了哪些复选

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

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

什么有效 I`v通过以下方式成功地建立了HABTM模型:员工拥有多种语言(即指定哪名员工使用哪种语言)

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

在编辑表单上,我看到在创建员工时选中了哪些复选框

我认为(可能)是有罪的 在创建和更新员工时评估哪些数据进入数据库时,我发现
$this->data
变量结构不同

在创建表单时(选中两种语言):

在更新表单上(选中其他语言,因此为3种语言):

请注意,现在可以在
$this->data[“Employee”][“Language”]
下访问语言,这与创建
$this->data[“Language”]

变通办法 如果我做了
$this->data[“Language”]=$this->data[“Employee”][“Language”]然后保存值(耶),但employee_language HABTM表中存在重复条目(哦,否)

那么,我应该切换哪个开关以使我的复选框可更新

更多详细信息(如果您愿意) (model)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(这是创建表单。此代码段显示所有可用语言的复选框):

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

。。。
...

马克在评论中给出了解决问题的答案:

。。。您不需要,也不应该在表单中使用“选定” 输入数组

是的,当我删除“selected”属性时,我突然能够更新HABTM数据。 现在我的输入控件看起来像:

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


没有办法将评论转换为答案,试图联系@mark以发布他的评论作为答案,但没有采取任何行动,我正在回答自己的问题,以便其他人可以看到这个问题有解决方案。这就是meta上的建议:

缺少控制器代码。很明显,那里出了什么问题。因为您不需要而且不应该在表单输入数组中使用“selected”。@马克,我的控制器代码没有丢失,但您是对的-我不需要selected属性。删除了,一切都正常。请把它贴出来作为答复,以便我以后可以接受。但我仍然有一个问题:旧的HABTM数据在更新时不会被删除。但是(来自cakebook)“默认情况下,在保存HasandBelongToMany关系时,Cake将在保存新的行之前删除联接表上的所有行。例如,如果您有一个关联了10个子级的俱乐部”,尽管我将其设置为“唯一”=>模型中的true param:/但这可能是另一个问题。Janis当您编辑读入的$this->数据的状态,然后设置为最初传递给表单时?它与您第一次创建时保存的$this->数据的格式相同吗?@Janis您的HABTM连接表结构是什么样子的?@Leo,正如我
v所说,mark已经给出了答案。现在,编辑后的数据结构与第一次创建时的数据结构相同。但是,如果我将
selected`property添加到
$form->input
,那么我的数据结构看起来就不一样了,但与我粘贴在标题“我发现(可能)有罪”中的第二个数据结构相似。
class Language extends AppModel {

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