我正在使用CakePHP并遵循其教程。我想更新一条记录,但是当我创建它时创建另一条记录而不是更新。根据教程我的代码如下:
$data = array('Id' => $id, 'Approved' => 12);
$this->names->save($data);
导致
SQLSTATE [23000]:完整性约束违规:1062重复条目 密钥
的4
PRIMARY
如果我这样做
$this->names->Id=$id;
它增加了一条新记录。我该如何解决这个问题?
答案 0 :(得分:11)
$this->names->id=$id;
$this->names->set(array('Approved'=>12));
$this->names->save();
答案 1 :(得分:3)
密钥必须是id
而不是Id
。如果你的表中你不能使用id(小写)而你必须使用Id(大写),那么你必须在你的模型文件中设置它
你也没有遵循惯例:模型应该是Name而不是名字(singular和CamelCase)
答案 2 :(得分:2)
除非你故意不遵守Cake命名约定(有充分理由),否则你应该坚持下去。这意味着,模型应该大写 - 单数命名,表字段应该是小写的。此外,您的数据数组必须具有要保存的模型的名称。
所以:
$data = array('Name' => array('id' => $id, 'approved' => 12));
$this->Name->save($data);
答案 3 :(得分:2)
要在主键可用时更新单个字段值,saveField()
也可用。
Model::saveField(string $fieldName, string $fieldValue, $validate = false)
用于保存单个字段值。设置模型的ID (
$this->ModelName->id = $id
)就在致电saveField()
之前。什么时候 使用此方法,$fieldName
应仅包含该名称 字段,而不是模型和字段的名称。 例如,要更新博客帖子的标题,请调用saveField 从控制器可能看起来像这样:$this->Post->saveField('title', 'A New Title for a New Day');
它还具有使用替代语法传递validate
,callbacks
等参数的功能:
saveField(string $fieldName, string $fieldValue, array $params = array())
参考文献:Documentation,API