Cakephp 2模型beforeSave()未被调用

时间:2012-07-16 16:12:46

标签: cakephp cakephp-2.0 cakephp-appmodel

我无法弄清楚为什么这段代码不起作用。 beforeSave未被调用。它应该会使保存失败并在调试日志中添加一些行,但实际上它确实保存正常,并且调试日志中没有写入任何行。

<?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;
    }
}   
?>

我在控制器中启动保存,如下所示:

public function add($category_id = null)
    {
        if ($category_id == null) {
            $this->Session->setFlash(__('Category id cant be null'),'default', array('class' => 'error-message'));
            $this->redirect(array('action' => 'index', 'controller' => 'categories'));
        }
        else
        {
            if($this->request->is('post'))
            {
                $this->Link->create();
                $this->Link->set('category_id' => $category_id));
                if($this->Link->save($this->request->data))
                {
                    $this->Session->setFlash(__('The link has been saved'),'default', array('class' => 'success'));
                    $this->redirect(array('action' => 'index/'.$category_id));
                }
                else
                    $this->Session->setFlash(__('The link could not be saved. Please, try again.'),'default', array('class' => 'error-message'));
            }
            $this->set('category_id',$category_id);
        }
    }

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

2 个答案:

答案 0 :(得分:3)

以下是对您的代码的一些一般性建议和一些评论:

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

2)你正在使用条件数组不正确(在这种情况下)。

array('conditions' => array('Link.status = 1 AND Link.category_id = '.$this->data[$this->alias]['category_id'])

你真的应该这样做:

array('conditions' => array('Link.status' => 1, 'Link.category_id' => $this->data[$this->alias]['category_id'])

3)您的重定向使用错误

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

应该是:

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

答案 1 :(得分:2)

正如所写的那样,你的save()总是会失败,因为这个是beforeSave()。 beforeSave()必须返回true才能使save函数成功。 事实上,你的似乎总是返回false,保证失败的保存。

从蛋糕手册:

  

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