1

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

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

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

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

4

2 回答 2

1

正如我所见,这个问题有三种解决方案。

  1. 在数据库列中设置默认值(最简单,最好?)
  2. 每次都为您的输入添加角色。
  3. 查找用户并在缺少角色时添加角色

前两个选项似乎很明显,所以我只说明最后一个。

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字段。然后,它会检查一个空角色并在必要时用默认值填充它。显然他拥有的代码越多,出现错误的可能性就越大,所以我建议使用默认列值的第一个选项。

于 2012-10-10T15:53:16.137 回答
0

尝试:

if (empty($this->data[$this->alias]['role']) && empty($this->role)) {
   $this->data[$this->alias]['role'] = 'user';
}
于 2012-10-10T10:33:57.177 回答