【问题标题】:How to update an existing record in CakePHP?如何更新 CakePHP 中的现有记录?
【发布时间】:2018-05-03 23:49:58
【问题描述】:

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

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

结果

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

如果我这样做

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

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

【问题讨论】:

  • 我认为你没有遵循蛋糕惯例。型号名称应以大写字母开头
  • Moyed Ansari - 这与他提出的问题无关。

标签: cakephp


【解决方案1】:
$this->names->id=$id;                
$this->names->set(array('Approved'=>12));                
$this->names->save();

【讨论】:

  • 按照上面的代码sn-p,它创建新记录,还没有更新
  • @DoNhuVy 请注意 $id 必须等于您在数据库中的 id。这是进行保存更新而不是插入的关键。您必须将模型主键设置为已经存在的主键。
【解决方案2】:

密钥必须是 id 而不是 Id。如果在您的表格中您不能使用 id(小写)并且您必须使用 Id(大写),那么您必须在您的模型文件中设置它

您也没有遵循约定:模型应该是名称而不是名称(单数和驼峰式)

【讨论】:

    【解决方案3】:

    除非您故意不遵循 Cake 命名约定(有充分的理由),否则您应该遵守它。这意味着,模型应该是大写的单数命名,而表字段应该是小写的。此外,您的数据数组必须具有您要保存的模型的名称。

    所以:

    $data = array('Name' => array('id' => $id, 'approved' => 12));
    $this->Name->save($data);
    

    【讨论】:

      【解决方案4】:

      要在主键可用时更新单个字段值,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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多