我正在使用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 =>阵列( [达到的最大深度] ) }
答案 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";
}