编辑CakePHP 2中的表:更新/插入错误

时间:2015-11-20 10:00:40

标签: php cakephp cakephp-2.0

问题:编辑条目时,SQL正在进行INSERT而不是UPDATE。

我有两个SQL表:users和users_detail。 users(id,role,name,password)& users_detail(id,adress,city,user_id)

外键users_detail.user_idusers.id相关联。

如果用户想编辑他的地址,我在我的cakephp应用程序中有一个用于编辑users_detail的表单。 这是我的控制器:

        public function admin_edit_dashboard($id = null){
    if (!$this->User->exists($id)) {
        throw new NotFoundException('Invalid user details');
    }
    if ($this->request->is('post') || $this->request->is('put')) {

        if ($this->User->UserDetail->save($this->request->data, true, ['id', 'address', 'city'])) {
            $this->Session->setFlash('The user has been saved');
            return $this->redirect(array('action' => 'dashboard'));
        } else {
            $this->Session->setFlash('The user could not be saved. Please, try again.');
        }
    } else {
        //$this->request->data = $this->User->read(null, $id);
        $user = $this->User->UserDetail->find('first', array(
            'conditions' => array(
                'UserDetail.user_id' => $id
            )
        ));
        $this->request->data = $user;
    }
    $this->set(compact('user'));
}

我的表格:

<?php echo $this->Form->create('UserDetail');?>
        <?php echo $this->Form->input('address', array('class' => 'form-control')); ?>
        <br />
        <?php echo $this->Form->input('city', array('class' => 'form-control')); ?>
        <br />
        <?php echo $this->Form->button('Submit', array('class' => 'btn btn-primary')); ?>
        <?php echo $this->Form->end(); ?>

但是当我验证表单以编辑细节时,我有一个错误:

  

错误:SQLSTATE [23000]:完整性约束违规:1062密钥'PRIMARY'重复输入'0'

因为SQL查询不是UPDATE而是INSERT。我不知道为什么。

  

SQL查询:INSERT INTO cakeuser_details   (adress_excity_ex)VALUES('玫瑰街',   '伦敦')

谢谢!

编辑:它的确有效,感谢您的帮助!添加了好的代码。

3 个答案:

答案 0 :(得分:2)

您的User模型应与UserDetail关联,如:

public $hasOne = array('UserDetail');

和你的UserDetail

public $belongsTo = array('User');

然后您不必使用loadModel,只需执行:

$this->User->UserDetail->find('first', array(...));

您应该从UserDetailsController操作中修改用户详细信息。

在您的视图中添加行以了解您正在编辑的内容:

echo $this->Form->input('id');

然后只需通过$this->request->data保存即可。应该这样做。就像我说的,检查数据库中的表id,它必须是自动增量。

答案 1 :(得分:2)

您似乎遇到了一些问题。

$this->request->address是正确的。表单数据以$this->request->data传递,因此您应该使用$this->request->data['UserDetail']['address']

如果您想确保只保存特定字段,可以将这些字段作为save()的第三个参数传递,然后您不需要事先使用set(): -

$this->UserDetail->save($this->request->data, true, ['id', 'address', 'city']);

SQL错误意味着user_details表上的主键未设置为自动递增(应该是)。这就是INSERT失败的原因。

您还忘记为您尝试更新的记录传递主键,因此Cake假定您要创建新记录。确保包含这个,以便Cake知道使用UPDATE。例如,在视图表单中包含以下内容: -

echo $this->Form->hidden('id');

答案 2 :(得分:0)

您无法通过在控制器中告知

来更新您的表格
$this->UserDetail->save($this->request->data)

相反,你应该尝试做类似

的事情
//find that specific row in database and then update columns and save it

$this->UserDetail->set(array('address'=>$request->address,'city'=>$request->city));                
$this->UserDetail->save();

您的模型希望将其保存为已存在的user_details下的新id = 0,因为您未指定要更新它以及要更新的列。

希望有所帮助