Правило проверки составного уникального индекса (неосновного)

Я уверен, что я не первый, у кого есть составные уникальные ключи в таблицах и кто хочет их валидировать. Я не хочу изобретать велосипед, поэтому сначала спрашиваю здесь. У меня есть несколько таблиц, в которых столбцы «id» являются первичными ключами, а два других столбца — уникальными составными ключами. Было бы неплохо иметь правило проверки, чтобы проверять уникальность отправленной записи и отображать ошибку проверки, если это не так. В Cakephp это можно сделать с помощью пользовательского правила проверки. Я почти уверен, что кто-то уже создал такой метод.

В идеале это был бы метод в app_model.php, который мог бы использоваться разными моделями.


person bancer    schedule 10.08.2010    source источник


Ответы (3)


Я использую эту функцию:

function checkUnique($data, $fields) {
    if (!is_array($fields)) {
            $fields = array($fields);
        }
        foreach($fields as $key) {
            $tmp[$key] = $this->data[$this->name][$key];
        }
    if (isset($this->data[$this->name][$this->primaryKey]) && $this->data[$this->name][$this->primaryKey] > 0) {
            $tmp[$this->primaryKey." !="] = $this->data[$this->name][$this->primaryKey];
        }
    //return false;
        return $this->isUnique($tmp, false); 
    }

в основном использование:

'field1' => array(
                'checkUnique' => array(
                    'rule' => array('checkUnique', array('field1', 'field2')),
                    'message' => 'This field need to be non-empty and the row need to be unique'
                ),
            ),
'field2' => array(
                'checkUnique' => array(
                    'rule' => array('checkUnique', array('field1', 'field2')),
                    'message' => 'This field need to be non-empty and the row need to be unique'
                ),
            ),

Таким образом, в основном это покажет предупреждение под каждым из полей о том, что оно не уникально.

Я использую это много, и это работает правильно.

person Nik Chankov    schedule 10.08.2010
comment
Спасибо! Это именно то, что я хотел. Единственным недостатком является то, что он создает 2 идентичных запроса при проверке 2 полей. - person bancer; 10.08.2010

В версиях CakePHP/2.x, выпущенных за последние несколько лет, правило isUnique необязательно принимает несколько столбцов:

Вы можете проверить уникальность набора полей, предоставив несколько полей и установив $or в false:

public $validate = array(
    'email' => array(
        'rule' => array('isUnique', array('email', 'username'), false),
        'message' => 'This username & email combination has already been used.'
    )
);

Я не уверен в точной версии, когда эта функция была доступна, но есть ошибка исправлено в ядре еще в октябре 2014 г., поданном против ветвей 2.3 и 2.4.

person Álvaro González    schedule 21.03.2017

Вы можете поместить его в модель приложения, но я предлагаю просто добавить его в модель напрямую, поместив правило с его свойством $validate.

Ознакомьтесь со встроенным isUnique. правило.

person Jason McCreary    schedule 10.08.2010
comment
'isUnique' проверяет только одно поле для одного столбца. Мне нужно правило проверки для двух столбцов, составляющих составной уникальный ключ. - person bancer; 10.08.2010
comment
Я понимаю. Прости. Тогда да, если это что-то в нескольких моделях, я бы создал собственное правило проверки и поместил его в app_model.php. - person Jason McCreary; 10.08.2010