在非对象错误时调用成员函数set()


CakePHP: Call to a member function set() on a non-object error

我的控制器似乎有bug:

public function addAdmin($id) {
    $this->User->id = $id;
    $this->User->set('role','admin');
    $this->User->save();
}

所以它给了我错误Call to a member function set() on a non-object

实际上,我想在一个名为'role'的表列中更新'role'字段,并将其设置为'admin'。

你能想象出怎么了吗?我看过很多教程使用这个成功,但这里显然我错过了一些东西。

PS: I'm a cakephp newbie:D

提前感谢!

User模型未加载

试着加载:

public function addAdmin($id) {
    $this->loadModel('User'); // here
    $this->User->id = $id;
    $this->User->set('role','admin');
    $this->User->save();
}

如果你在模型的控制器中,你不必加载模型——但在这种情况下,你在一个不同的控制器中,所以你要么需要加载模型(如上所述),要么通过一个已经加载的关联模型来访问它。

因此,作为一个例子,如果你在RolesController中,你可以访问关联的'User'模型,而不必特别加载它:

$this->Role->User->set('role', 'admin');

看到你的代码,你从AdminsController调用User

除非你做

var $uses = array('Admin', 'User');

在控制器的开头(不要这样做,这会影响性能),它不会识别你的User模型。默认情况下,AdminsController只能直接访问Admin模型(即使用$this->Admin), FoosController只能访问Foo模型(使用$this->Foo),等等。

你可以像@Dave在他的回答中指出的那样做,但是要记住,如果Admin与User模型相关(与hasMany, belongsTo或任何其他关联),那么你可以像这样从AdminsController访问User模型

$this->Admin->User->set(1,2);

如果你有一个与User相关联的Foo模型,例如,同样的连接规则适用,在你的AdminsController中你可以做

$this->Admin->User->Foo('find')

(大量这样的连接会影响性能)。

loadModel适合我!我最初尝试使用调用两个不同模型的模型函数,但我为每个模型创建了一个模型函数,然后在单个控制器中调用函数。

            if ($this->Transaction->saveTrans(PARAMETERS)){
            $this->Session->setFlash(__('Transaction Success!'));
            $this->loadModel('Creditcard');
            if ($this->Creditcard->saveCC(PARAMETERS)){
                $this->Session->setFlash(__('Credit Card Success!'));
            } else {
                $this->Session->setFlash(__('Unsuccessful: The Credit Card was approved but could not be saved. Please try again.'));
            }