未调用Cakephp 2模型beforeSave()

未调用Cakephp 2模型beforeSave(),cakephp,cakephp-2.0,cakephp-model,Cakephp,Cakephp 2.0,Cakephp Model,我不明白为什么这个代码不起作用。未调用保存之前的。它应该失败保存并在调试日志中放入一些行,但实际上它确实保存OK,并且没有在调试日志中写入任何行 <?php class Link extends AppModel { var $name = "Link"; var $belongsTo = array('Category' => array('className' => 'Category', 'foreignKey' => 'category_id'))

我不明白为什么这个代码不起作用。未调用保存之前的
。它应该失败保存并在调试日志中放入一些行,但实际上它确实保存OK,并且没有在调试日志中写入任何行

<?php
class Link extends AppModel {
    var $name = "Link";
    var $belongsTo = array('Category' => array('className' => 'Category', 'foreignKey' => 'category_id'));

  public function beforeSave(){
        if ($this->data[$this->alias]['id'] == null) {
            $this->log("new record", 'debug');
            $link = $this->find('first',array('conditions' => array('Link.status = 1 AND Link.category_id = '.$this->data[$this->alias]['category_id']), 'order' => array('Link.order DESC') ));
            if (is_null($link)) {
                $this->data[$this->alias]['order'] = 1;
            }else{
                $this->data[$this->alias]['order'] = $link['Link']['order'] + 1;
            }
        }
        else {
            $this->log("old record", 'debug');
        }
        return false;
    }
}   
?>

StackOverflow中的另一个问题指出,
beforeSave
方法需要在模型中声明。我也对另一个模型做了同样的事情。

以下是一些一般建议和对代码的一些注释,以获得答案:

1) 如果模型回调或任何模型方法不起作用,请确保使用的是正确的模型,而不是默认模型(AppModel)。检查文件名、类名、扩展名(在您的情况下)和位置

2) 您错误地使用了条件数组(在本例中)

array('conditions'=>array('Link.status=1和Link.category\u id='.$this->data[$this->alias]['category\u id'])

你真的应该做:

array('conditions' => array('Link.status' => 1, 'Link.category_id' => $this->data[$this->alias]['category_id'])
3) 你的重定向被错误地使用了

$this->redirect(数组('action'=>'index/'.$category_id))

应该是:

$this->redirect(array('action' => 'index', $category_id));

以下是一些关于代码的一般性建议和评论,以供回答:

1) 如果模型回调或任何模型方法不起作用,请确保使用的是正确的模型,而不是默认模型(AppModel)。检查文件名、类名、扩展名(在您的情况下)和位置

2) 您错误地使用了条件数组(在本例中)

array('conditions'=>array('Link.status=1和Link.category\u id='.$this->data[$this->alias]['category\u id'])

你真的应该做:

array('conditions' => array('Link.status' => 1, 'Link.category_id' => $this->data[$this->alias]['category_id'])
3) 你的重定向被错误地使用了

$this->redirect(数组('action'=>'index/'.$category_id))

应该是:

$this->redirect(array('action' => 'index', $category_id));
如前所述,您的save()将始终失败,并使用beforeSave()。beforeSave()必须返回true才能使save函数成功。 事实上,您的似乎总是返回false,这保证了保存失败

从蛋糕手册:

确保beforeSave()返回true,否则保存将失败

如前所述,您的save()将始终失败,并使用beforeSave()。beforeSave()必须返回true才能使save函数成功。 事实上,您的似乎总是返回false,这保证了保存失败

从蛋糕手册:

确保beforeSave()返回true,否则保存将失败


在add方法中,添加
debug(get_class($this->Link))输出什么?谢谢评论。它在控制器中显示:“AppModel”和行#。这就是您的问题所在。它没有找到你的链接模型,所以它是基于AppModel创建的。你把那个文件放在哪里了?链接模型的文件名是什么?谢谢,文件扩展名是个问题。如果您想保留记录,请继续。在add方法中,添加
debug(get_class($this->Link))输出什么?谢谢评论。它在控制器中显示:“AppModel”和行#。这就是您的问题所在。它没有找到你的链接模型,所以它是基于AppModel创建的。你把那个文件放在哪里了?链接模型的文件名是什么?谢谢,文件扩展名是个问题。如果你想记录下答案,那就继续吧。优秀的,还需要大量练习cakephp!还值得一提的是,您也应该始终调用父方法:public function beforeSave(){parent::beforeSave();…},以确保父类的代码也能正确执行!还值得一提的是,您也应该始终调用父方法:public function beforeSave(){parent::beforeSave();…}以确保父类的代码也正确执行。确切地说,问题甚至没有被调用,false只是为了在我进行实际保存之前对其进行测试,但是谢谢你的澄清。很明显,这个问题甚至没有被调用,false只是为了在我进行实际保存之前测试它,但是谢谢你的澄清