Cakephp isUnique验证不是在一个字段上触发,而是在另一个字段上工作

时间:2010-07-14 11:21:16

标签: php validation cakephp unique

当我从注册表单保存信息时,我对用户名和电子邮件字段有一些验证规则(我已粘贴下面的规则)。使用saveAll()函数自动调用验证。

问题是用户名字段上的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.')

    )

);

5 个答案:

答案 0 :(得分:6)

“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.

答案 1 :(得分: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);
}

答案 2 :(得分:1)

以下是如何在cakephp 2.3中使用唯一验证规则。假设你有一个字段'用户名'想要是唯一的,下面的代码就可以了。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

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