更新:此代码现在是杂货店 CRUD 版本 >= 1.4 的一部分,您不再需要使用扩展程序。有关更多信息,请参阅unique_fields 的文档
我会尽量解释清楚:
1.首先对于那些杂货店 CRUD 低于或等于 1.3.3 的人必须使用这个小更改:https://github.com/scoumbourdis/grocery-crud/commit/96ddc991a6ae500ba62303a321be42d75fb82cb2
2. 其次在应用程序/库中创建一个名为grocery_crud_extended.php 的文件
3. 将以下代码复制到您的文件 application/libraries/grocery_crud_extended.php
<?php
class grocery_CRUD_extended extends grocery_CRUD
{
protected $_unique_fields = array();
public function unique_fields()
{
$args = func_get_args();
if(isset($args[0]) && is_array($args[0]))
{
$args = $args[0];
}
$this->_unique_fields = $args;
return $this;
}
protected function db_insert_validation()
{
$validation_result = (object)array('success'=>false);
$field_types = $this->get_field_types();
$unique_fields = $this->_unique_fields;
$add_fields = $this->get_add_fields();
if(!empty($unique_fields))
{
$form_validation = $this->form_validation();
foreach($add_fields as $add_field)
{
$field_name = $add_field->field_name;
if(in_array( $field_name, $unique_fields) )
{
$form_validation->set_rules( $field_name,
$field_types[$field_name]->display_as,
'is_unique['.$this->basic_db_table.'.'.$field_name.']');
}
}
if(!$form_validation->run())
{
$validation_result->error_message = $form_validation->error_string();
$validation_result->error_fields = $form_validation->_error_array;
return $validation_result;
}
}
return parent::db_insert_validation();
}
protected function db_update_validation()
{
$validation_result = (object)array('success'=>false);
$field_types = $this->get_field_types();
$unique_fields = $this->_unique_fields;
$add_fields = $this->get_add_fields();
if(!empty($unique_fields))
{
$form_validation = $this->form_validation();
$form_validation_check = false;
foreach($add_fields as $add_field)
{
$field_name = $add_field->field_name;
if(in_array( $field_name, $unique_fields) )
{
$state_info = $this->getStateInfo();
$primary_key = $this->get_primary_key();
$field_name_value = $_POST[$field_name];
$ci = &get_instance();
$previous_field_name_value =
$ci->db->where($primary_key,$state_info->primary_key)
->get($this->basic_db_table)->row()->$field_name;
if(!empty($previous_field_name_value) && $previous_field_name_value != $field_name_value) {
$form_validation->set_rules( $field_name,
$field_types[$field_name]->display_as,
'is_unique['.$this->basic_db_table.'.'.$field_name.']');
$form_validation_check = true;
}
}
}
if($form_validation_check && !$form_validation->run())
{
$validation_result->error_message = $form_validation->error_string();
$validation_result->error_fields = $form_validation->_error_array;
return $validation_result;
}
}
return parent::db_update_validation();
}
}
4.现在您只需像这样加载grocery_CRUD_extended:
$this->load->library('grocery_CRUD');
$this->load->library('grocery_CRUD_extended');
然后使用:
$crud = new grocery_CRUD_extended();
代替:
$crud = new grocery_CRUD();
5. 现在您可以简单地拥有它的 unique_fields,它的工作原理如下:
$crud->unique_fields('field_name1','field_name2','field_name3');
在你的情况下:
$crud->unique_fields('equip_type_id','site_id');
很简单吧?
这是在不实际更改杂货店 CRUD 的核心的情况下检查字段是否唯一。您可以简单地使用grocery_CRUD_extended 而不是grocery_CRUD 并照常更新grocery CRUD 库。由于我是该库的作者,我将尝试将其包含在杂货店 CRUD 版本 1.4 中,因此您将来不必使用杂货店_CRUD_extended。