Проверка Cakephp isUnique не запускается на одном поле, но работает на другом - PullRequest
1 голос
/ 14 июля 2010

Когда я сохраняю информацию из регистрационной формы, у меня есть некоторые правила проверки в полях имени пользователя и электронной почты (я вставил правила ниже).Проверка вызывается автоматически с помощью функции 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 ]

6 голосов
/ 12 августа 2010

Правило 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, если поле не является уникальным и требуемая функциональность будет восстановлена.

3 голосов
/ 19 июля 2010

Я до сих пор не могу найти, в чем проблема, поэтому в качестве временного решения я написал собственное правило. Если кому-то еще это нужно:

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 голос
/ 06 мая 2013

Вот как использовать уникальное правило проверки в cakephp 2.3.допустим, у вас есть поле 'username', которое хочет быть уникальным, следующий код поможет вам.

'username' => array(
'notempty' => array(
'rule' => array('notempty'),
'update' operations
),
'rule' => 'isUnique',
'message' => 'User alread exists!'
),
0 голосов
/ 19 января 2012

Поместите $ this-> Form-> hidden ('id') в вашу форму. Это должно работать.

0 голосов
/ 15 июля 2010

Посмотрел мою пользовательскую модель, и она выглядит так:

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