2010-07-14 42 views
1

当我从注册表单中保存信息时,我对用户名和电子邮件字段(我粘贴了下面的规则)有一些验证规则。使用saveAll()函数自动调用验证。Cakephp isUnique验证不在一个字段上触发,但在另一个字段上工作

问题是,用户名字段上的isUnique规则根本不起作用(不返回任何错误)。该领域的其他规则工作得很好,并且对电子邮件字段的唯一验证也起作用。我似乎无法弄清楚为什么会发生这种情况,两个规则基本相同。

var $validate = array(

    'username' => array(

     'isUnique' => array (

      'rule' => 'isUnique', 

      'message' => 'This username already exists.'), 

     'custom' => array (

      'rule' => array('custom', '/^[A-Za-z0-9,\.-_]*$/i'), 

      'message' => 'The username can only contain letters, numbers, _, - and .'), 

     'minLength' => array(

      'rule' => VALID_NOT_EMPTY, 

      'message' => 'You must fill in the username.')   
    ), 

    'email' => array(

     'isUnique' => array (

      'rule' => 'isUnique', 

      'message' => 'This email address already exists in our database.'), 

     'valid' => array (

      'rule' => array('email', false), 

      'message' => 'Invalid email.'), 

     'minLength' => array(

      'rule' => VALID_NOT_EMPTY, 

      'message' => 'You must fill in the email address.') 

    ) 

); 
+0

我敢肯定,为了让它知道这是独一无二的,你需要设置你的模型文件中的主键,并且还通过了相同的领域被保存在您的文章数据。 – 2010-07-14 16:48:49

+0

我已经将模型中的用户名字段声明为主键,并且它与发布数据中的字段相同,并且我已检查过该字段的内容是否正确。 但我不确定它必须是主键。唯一的规则仅适用于电子邮件的文件,即使它不是主键。 – 2010-07-14 17:36:54

+0

尝试在''rule'=>'isUnique','后面加''allowEmpty'=> false,'或''required'=> true,'。 – bancer 2010-07-15 01:07:46

回答

5

的“isUnique设置”规则会在其他行重复值。如果“isUnique”测试也是主键,那么这会造成问题。因此,基于您的规则/上述模型,如果你看一下SQL转储运行规则时,你可能会看到类似

SELECT COUNT(*) FROM users WHERE username = 'x' AND username != 'x' 

这显然返回0或在测试中“独一无二”。修复的方法是将主键设置为与您正在测试规则的字段不同。当你这样做时,SQL转储应该显示类似

SELECT COUNT(*) FROM users WHERE username = 'x' AND key != 'y' 

这将返回> 0时,该字段不是唯一的,并且所需的功能将被恢复。

+0

你是对的,这解决了这个问题。谢谢。 – 2010-08-13 20:50:30

0

看着我的用户模型,它看起来像这样:

var $validate = array(
    'username' => array(
     'inUse' => array (
      'rule' => array('isUnique', 'username') 
     ) 
    ) 
) 
+0

它仍然无法正常工作。我很确定这个语法是正确的,因为它适用于电子邮件领域(它也是它在book.cakephp.org上展示的方式)。现在我试图找到其他的原因,阻止这个规则在一个领域工作,而不是为另一个领域工作。 – 2010-07-16 07:21:22

3

我仍然无法找到是什么问题,所以作为临时的解决方案我已经写了一个自定义规则。如果别人需要这个:

var $validate = array(
    'username' => array(
     'isUnique' => array (
      'rule' => array('checkUniqueUser'), 
      'message' => 'This username already exists.' 
     ) 
    ) 
) 

function checkUniqueUser() { 
    return ($this->find('count', array('conditions' => array('User.username' => $this->data['User']['username']))) == 0); 
} 
-1

将$ this-> Form-> hidden('id')放置在您的表单中。它应该工作。

+0

这与这个问题有什么关系?这将如何帮助? – vladko 2012-10-26 14:30:03

1

以下是如何在cakephp 2.3中使用isUnique valdiation规则。假设你有一个字段“用户名”想要是唯一的,下面的代码将会做到这一点。

'username' => array(
'notempty' => array(
'rule' => array('notempty'), 
'update' operations 
), 
'rule' => 'isUnique', 
'message' => 'User alread exists!' 
), 
相关问题