model-> save()总是使用'​​insert',即使给出了id

时间:2013-07-10 15:42:14

标签: cakephp cakephp-2.3

我正在使用CakePHP v2.3.5。当我更新表

`users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(320) NOT NULL,
  `password` varchar(45) NOT NULL,
  `firstname` varchar(255) DEFAULT NULL,
  `lastname` varchar(255) DEFAULT NULL,
  `country` varchar(255) DEFAULT 'SG',
   PRIMARY KEY (`id`)
);

使用$this->User->save($this->request->data),它总是触发一个insert命令并抛出

"Integrity constraint violation: 1062 Duplicate entry '10' for key 'PRIMARY'"

request->data对象是:

array(
    'User' => array(
        'id' => '10',
        'firstname' => 'Someone',
        'lastname' => 'Surname',
    )
)

我现在使用的完整动作是:

public function addInfo() {
    if ($this->request->is('post')) {

        $this->User->create();
        $this->User->id=(int)$this->request->data['User']['id'];
        if ($this->User->save($this->request->data)) {

        }

    }
}

Model中的beforeSave函数是:

  

public function beforeSave($ options = array()){

   if (isset($this->data['User']['password'])) {
       $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
   }
   return true;
     

}

在用户对象中,此id => false看起来很可疑

  

object(User){     displayField => '名字'     primaryKey => 'ID'     useDbConfig => '默认'     useTable => “用户”     id =>假     data =>阵列(         [达到的最大深度]     )   }

5 个答案:

答案 0 :(得分:2)

在保存之前进行创建

$this->User->create();
$this->User->save($this->request->data); //with the id cast as integer

create用于重置模型,因此即使是更新,也应该将该函数作为预防措施。

答案 1 :(得分:0)

如果要更新值而不是创建新值,请确保将主键字段传递到数据数组中:

$data = array('id' => 10, 'firstname' => 'Someone', 'lastname'=> 'Surname');
// This will update User with id 10

$this->User->save($data);

答案 2 :(得分:0)

尝试在保存之前设置ID:

$this->User->id = useridhere
$this->Users->save($this->request->data);

答案 3 :(得分:0)

找到原因。我碰巧在模型中有一个名为getId的函数,而CakePHP也使用getId来检查行的存在,因此,当通过id检查时它总是得到否定结果,因此它触发了一个插入调用更新电话。谢谢大家的帮助。

答案 4 :(得分:0)

我在这里遇到了同样的问题。我尝试了不同的配置(使用save(),saveAll(),saveMany(),saveAssociated(), deep 选项),后来我发现我的表有不同的主键(主要字段名称不是" id")。将主要字段名称添加到我的模型可以解决问题。

class SomeModel extends AppModel {

    public $primaryKey = "different_primary_field_name_for_id";

}