【问题标题】:Update rows in CakePHP更新 CakePHP 中的行
【发布时间】:2013-03-22 04:55:56
【问题描述】:

我正在尝试更新 cakePHP 2.3.1 中的一行。我有类 Test 使用 $validates 数组扩展 AppModel, 和控制器(简化):

public function editstudent()   {
    if($this->request->data)    {
        $this->Test->stuId= $this->data['Test']['stuId'];
        if ($this->Test->save($this->request->data))    {
            $this->set('state',1);
        }
    }

书上说:

创建或更新由模型的 id 字段控制。如果设置了 $Model->id,则更新具有此主键的记录。否则会创建一条新记录:

如上所述,我设置了 $this->Test->StuId 但是当我提交表单时它仍然显示:

错误:SQLSTATE[23000]:违反完整性约束:1062 键 'PRIMARY' 的重复条目 '' SQL 查询:INSERT INTO ........

如错误所示,查询仍然是 INSERT 而不是 UPDATE 那么我需要做什么才能更新,请帮助我:(

编辑:@thaJeztah 我已经像这样编辑了我的视图:

class Test extends AppModel {
var $name= 'Test';
var $primaryKey= 'stuId';
public $validate= array(.......);
}

但还是出现同样的问题

数据库错误 错误:SQLSTATE [23000]:违反完整性约束:1062 键 'PRIMARY' 的重复条目 '' SQL 查询: INSERT INTO cakePhp.tests (stuName, stuDoB, stuAdd) VALUES ('Đào Đức Anh', '2013-03-25', 'Kim Liên')

如您所见,查询仍然是 INSERT 而不是 UPDATE,您能帮我解释一下为什么仍然会发生这种情况吗:(

【问题讨论】:

  • tests 表的结构是什么?
  • 'tests' 表有 5 个字段:主键:stuId 和另外 4 个字段:stuName,stuSex,stuDoB,stuAdd

标签: cakephp cakephp-2.3


【解决方案1】:

因为您没有遵循 CakePHP 约定(请参阅 CakePHP Model Conventions,您需要手动指定用于模型的主键和/或数据库表;

class Test extends AppModel {
    public $primaryKey = 'studId';
}

另外,我想知道“测试”是否是保留名称,可能根本不是模型的专有名称。

但是,如果这是一个新项目,我会强烈建议坚持 CakePHP 约定,它们的存在是有原因的,并且在使用这个框架进行开发时会让生活变得更轻松

更新 根据 OP 的评论删除了 $useTable 属性

【讨论】:

  • 我不明白你的意思。因为我知道蛋糕约定,类 Test 扩展 AppModel 将坚持数据库中的表测试,所以我不必像上面的代码那样指出它?跨度>
  • 好的,如果你的表被命名为'test',你可以删除'useTable'属性,但是,如果你的主键不是'id'而是'studId',那么你应该指定这个。
  • 这意味着 cakePhp 无法检测到自己表中的主键是什么?我没想到,tks man。
  • 这就是约定的用途;默认情况下,您应该使用 'id' 作为主键的名称,并使用 [modelname]_id 作为模型的外键(例如 test_id)。字段名应小写,单词用下划线分隔。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多