Проверка UNIQUE поля в Codeigniter с 2 индексами

В Codeigniter Framework я могу проверить уникальное поле в базе данных MYSQL, используя «класс проверки формы». Exemple:

$this->form_validation->set_rules('form_field', 'form_label', 'is_unique[table.field]'); 

Работайте отлично, но мне нужно проверить поле из таблицы с индексом 2. Exemple:

 UNIQUE INDEX `id_aluno` (`id_aluno`, `ano`), 

Рамка Codeigniter может сделать это изначально?

Solutions Collecting From Web of "Проверка UNIQUE поля в Codeigniter с 2 индексами"

Я не думаю, что у CI есть встроенный случай для комбинированного PK но я бы использовал callback_ следующим образом: но обратите внимание, что вам нужно отправить второй PK как дополнительный, и правило должно быть применено к первому $ PK, см. Обратные вызовы для более информация об этом

 $this->form_validation->set_rules('form_field', 'form_label', 'callback_combpk[$pk2]'); public function combpk($pk1, $pk2) { $this->db->where('field1', $pk1); $this->db->where('field2', $pk2); $result = $this->db->get('table'); if($result->num_rows() > 0) { $this->form_validation->set_message('combpk','something'); // set your message return false; } else{ return true;} } - $this->form_validation->set_rules('form_field', 'form_label', 'callback_combpk[$pk2]'); public function combpk($pk1, $pk2) { $this->db->where('field1', $pk1); $this->db->where('field2', $pk2); $result = $this->db->get('table'); if($result->num_rows() > 0) { $this->form_validation->set_message('combpk','something'); // set your message return false; } else{ return true;} } 

Не нашел описания встроенной поддержки этой функции в CodeIgniter. Вы можете проверить после запроса INSERT номер ошибки базы данных. Например:

 $last_id = $this->model->set(); if ($last_id === FALSE) if ($this->db->_error_number() == 1062) $this->data['message_error'] = 'Not unique.'; else $this->data['message_error'] = 'Database error.'; 

Этот метод имеет недостатки, но, безусловно, имеет преимущество – не используйте дополнительный запрос SELECT.

PS Если несколько разных составных уникальных индексов, то, конечно, вы можете использовать preg_match(<pattern_with_index_name>, $this->db->_error_message()); ,

 $this->form_validation->set_rules( 'form_field', 'form_label', 'trima|is_unique[table1.field1],trim|required|is_unique[table.field2]'); 

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

 'trima|is_unique[table1.field1],trim|required|is_unique[table.field2]' 

в одном коде

Возможно, вас интересует моя пользовательская функция is_unique. вот.

вы можете использовать его двумя способами:

 1. is_unique[table_name.field_to_check.id_field_name.id_field_value] //<-- unique 1 field only 2. is_unique[table_name.field_to_check.id_field_name != 'id_field_value' and anotherIdName='theValue'] //<-- custom where 

Просто сохраните этот код в файле, назовите его MY_Form_Validation.php и поместите его в каталог библиотек. Затем вы можете поместить эти is_unique

  public function is_unique($str, $field) { $result = true; try { if ($str) {//validate only if there's a value submitted $is_query = 0; $x = substr_count($field, '.'); //count of dots //ex: is_unique[is_unique[$table_name.$field_name.$field_id!='$id' and 1=1]] //ex: is_unique[$table_name.$field_name.id!='2' and name!='simson'] if($x == 2) { list($table, $field, $where) = explode('.', $field); $is_unique = 0; if ($where) { $logos = "select * from $table where $field =? and $where "; } else { $logos = "select * from $table where $field =? "; } $data = array($str); $qq = $this->CI->db->query($logos, $data); $is_query = 1; $row = $qq->row(); $is_unique = !(bool)$row; //is_unique = (row == empty) $result = (bool)$is_unique; } else { if ($x >= 3) { list($table, $field, $id_field, $id_val) = explode('.', $field); $is_unique = 0; if ($id_field && $id_val) { $logos = "select * from $table where $field =? and $id_field != '$id_val' "; } else { $logos = "select * from $table where $field =? "; } $data = array($str); $qq = $this->CI->db->query($logos, $data); $is_query = 1; $row = $qq->row(); if ($row) { if ($row->id) { if ($row->$id_field == $id_val) { $is_unique = 1; //means editing it self, allow it } else { //already exists with different id } } else { //used for left join table } } else { $is_unique = 1; //does not exists } $result = (bool)$is_unique; } else if ($x == 1) { list($table, $field) = explode('.', $field); $query = $this->CI->db->limit(1)->get_where($table, array($field => $str)); $is_query = 1; $result = $query->num_rows() === 0; } } if (is_log_query() && $is_query) { $logos = "logos is_unique x==$x: " . $this->CI->db->last_query(); log_to_file($logos); } else { $logos = "logos is_unique x==$x: NOT EXECUTED"; log_to_file($logos); } } }catch (Exception $e) { die($e->getTraceAsString()); } return $result; }