如何更新CakePHP中的现有记录?

时间:2014-03-17 11:13:35

标签: cakephp

我正在使用CakePHP并遵循其教程。我想更新一条记录,但是当我创建它时创建另一条记录而不是更新。根据教程我的代码如下:

$data = array('Id' => $id, 'Approved' => 12);
$this->names->save($data);

导致

  

SQLSTATE [23000]:完整性约束违规:1062重复条目   密钥4

PRIMARY

如果我这样做

$this->names->Id=$id;

它增加了一条新记录。我该如何解决这个问题?

4 个答案:

答案 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()也可用。

引自documentation

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');

它还具有使用替代语法传递validatecallbacks等参数的功能:

saveField(string $fieldName, string $fieldValue, array $params = array())

参考文献:DocumentationAPI