使用save()无法在CakePHP中更新(但创建新的)对象

时间:2014-05-02 12:08:01

标签: php mysql cakephp cakephp-2.4

在LAMP设置上使用CakePHP 2.4.9(Ubuntu 13.10,Apache 2,MySQL Server 5.5,PHP 5.5.3)。

尝试将模型(用户)打包到插件中,但我遇到了一个奇怪的问题:

在两个不同的操作中,我使用save()来创建或更新用户。这有效:

if ($this->request->data) {

    if ($this->User->create() && $this->User->save($this->request->data)) {
        $this->Session->setFlash(_('<strong>Congratulations!</strong> Successfully created a new user.'), 'default', array('class' => 'alert alert-success'));
        $this->redirect(array('action' => 'register'));
    } else {
        $this->Session->setFlash(_('<strong>Oops!</strong> Could not create a new user.'), 'default', array('class' => 'alert alert-danger'));
    }
}

但这不起作用:

if ($this->request->data) {

    $this->User->id = $id;

    if ($this->User->save($this->request->data)) {
        $this->Session->setFlash(_('<strong>Congratulations!</strong> Successfully updated your user account.'), 'default', array('class' => 'alert alert-success'));
        $this->redirect(array('action' => 'settings'));
    } else {
        $this->Session->setFlash(_('<strong>Oops!</strong> Could not update user account.'), 'default', array('class' => 'alert alert-danger'));
    }
}

当我尝试保存后一个示例(“更新操作”)时,它给出了以下错误:

  

致命错误

     

错误:在非对象上调用成员函数getColumnType()   文件:/home/johan/sites/userplugin/lib/Cake/Model/Model.php   行:1412

     

注意:如果要自定义此错误消息,请创建app / View / Errors / fatal_error.ctp

表单非常标准,我使用FormHelper创建表单和字段。但是在更新表单中,我有一个带有ID的隐藏字段:

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

如果我删除它,更新表单会通过,但会创建一个新对象!所以就像$this->User->id = $id没有做任何事情一样。我目前手动设置$id,所以$id = 1 ...

我尝试搜索类似的问题,但没有找到任何东西。一个讨论提到了ID字段,也许它没有正确设置?但我找不到任何解决方案。

3 个答案:

答案 0 :(得分:1)

有一个糟糕的模型参考

不同的代码排列不是直接与问题相关 - 或者可能只是表明另一个不同的问题=)。

line of code that is failing就是这样:

$this->{$model}->getColumnType($column);

其中$this是用户模型实例。 可能的含义是,当它失败时,该对象不是您希望检查的类:

debug(get_class($this->User));

在您的控制器中,很可能是AppModel

导致此错误的原因

这种情况的典型原因&#34;有时它起作用,有时它不会&#34;问题是有一些使用插件前缀的模型的引用,有一些不是,即

<?php

App::uses('MyPluginAppModel', 'MyPlugin.Model');

class Group extends MyPluginAppModel {

    public $hasMany = array(
        'User' => array(
            'className' => 'User'
        ),
        #'User' # Or like this
    )

}

它应该是这样的:

<?php

App::uses('MyPluginAppModel', 'MyPlugin.Model');

class Group extends MyPluginAppModel {

    public $hasMany = array(
        'User' => array(
            'className' => 'MyPlugin.User'
        ),
        #'MyPlugin.User' # Or like this
    )

}

这里发生的是它取决于首次访问相关模型的方式,以及在类注册表中填充User键的内容,以及为该模型引用的所有后续请求返回的内容。

要解决此问题,请确保始终使用正确的插件前缀引用模型(如果它不是插件模型,则当然没有前缀)。

答案 1 :(得分:1)

我最终发现的(并且应该早先排除,实际上是)在我的AppModel中定义了一个数组,用于配置插件,命名与我的插件相同是愚蠢的,也许是临界延迟

即。如果您的插件名为MyPlugin,请不要在AppModel中定义$myplugin数组。

答案 2 :(得分:0)

试试这个

//控制器

public function edit(){ 

    if (!empty($this->request->data)) {

        //if you want to save on User object
         $this->User->id = $this->request->data['User']['id'];

        if ($this->User->save($this->request->data)) {
        .................................
            $this->Session->setFlash(_('<strong>Congratulations!</strong> Successfully updated your user account.'), 'default', array('class' => 'alert alert-success'));
            $this->redirect(array('action' => 'settings'));
        } else {
            $this->Session->setFlash(_('<strong>Oops!</strong> Could not update user account.'), 'default', array('class' => 'alert alert-danger'));
        }
    } else {
       $this->request->data = $this->User->read(null, $id);
    }
}

//编辑视图

<?php 
echo $this->Form->create('User'); 
echo $this->Form->hidden('id'); 
echo $this->Form->input('first_name'); 
..
..
.  
echo $this->Form->end(__('Save')); 
?>