Правило проверки составного уникального индекса (неосновного) - PullRequest
6 голосов
/ 10 августа 2010

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

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

Ответы [ 3 ]

11 голосов
/ 10 августа 2010

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

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'
                ),
            ),

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

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

0 голосов
/ 21 марта 2017

В версиях 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.

0 голосов
/ 10 августа 2010

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

Проверьте встроенное правило isUnique .

...