在CakePHP模型回调函数中接收模型数据

时间:2012-10-10 10:28:41

标签: cakephp callback cakephp-2.1 datamodel

我尝试在CakePHP 2.1中的模型回调函数中使用现有的模型数据,但无法使其正常工作。 我所做的是尝试在beforeValidate()回调中获取用户角色并检查它是否为空。如果是,我会设置它。通常我会这样做,并且对于第一次创建记录,它的效果非常好。

if (empty($this->data[$this->alias]['role']))
    $this->data[$this->alias]['role'] = 'user';

问题是,每次更新现有记录(用户)时,都会再次设置角色。

问题:那么,如何检查记录数据中是否已设置字段role,而不是帖子数据(似乎$this->data[$this->alias]仅包含POST数据)?

2 个答案:

答案 0 :(得分:1)

我可以看到这个问题有三种解决方案。

  1. 在数据库列中设置默认值(最简单,最好?)
  2. 每次都为您的输入添加角色。
  3. 查找用户并添加缺少的角色
  4. 前两个选项显而易见,所以我只会说明最后一个。

    public function beforeValidate() {
      if (!empty($this->id) {
        $this->data[$this->alias][$this->primaryKey] = $this->id;
      }
      if (!empty($this->data[$this->alias][$this->primaryKey])) {
        // user exists, check their data
        $id = $this->data[$this->alias][$this->primaryKey];
        $user = $this->find('first', array(
          'conditions' => array($this->primaryKey => $id)
        ));
        $this->data[$this->alias]['role'] = $user[$this->alias]['role'];
      }
      if (empty($this->data[$this->alias]['role'])) {
        // new user but missing a role
        $this->data[$this->alias]['role'] = 'user';
      }
      return true;
    }
    

    此回调将检查是否已传递ID,如果是,则会查找用户并填充role字段。然后,它检查一个空角色,并在必要时用默认值填充它。显然他有更多的代码,错误的可能性越大,所以我建议默认列值的第一个选项。

答案 1 :(得分:0)

尝试:

if (empty($this->data[$this->alias]['role']) && empty($this->role)) {
   $this->data[$this->alias]['role'] = 'user';
}