2012-10-10 62 views
1

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

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

问题是,每当现有记录(用户)被更新时,角色将被重新设置。

问:那么,我该如何检查,如果场role在记录数据,而不是POST数据已经设置(好像$this->data[$this->alias]只包含POST数据)?

回答

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领域。然后,它检查一个空的角色,并在必要时用缺省值填充它。显然,他有更多的代码,错误的可能性更大,所以我建议默认列值的第一个选项。

+0

谢谢Jeremy,这看起来像是一个很好而干净的解决方案。 –

+0

酷,很高兴的选项之一工作!请记住,前两个将始终是最快,最少(可能)错误的选项。 – jeremyharris

0

尝试:

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

我曾尝试过,除'$ this-> id'字段总是返回'null'。 而且我可以通过控制器方法来识别ID正在工作,因为我使用了$ this-> user-> id = $ id;'。 –