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

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

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

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

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

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


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


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

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

licensed under cc by-sa 3.0 with attribution.