FuelPHP中的唯一键/索引


Unique Keys/Indexes in FuelPHP

我目前正在进行FuelPHP的第一次创业,我想知道如何在模型中标记某些密钥(例如用户名),以及是否可以使用石油来标记。特别是在模型验证方面,如:

protected static $_properties = array(
  'id',
  'name' => array(
     'data_type' => 'string',
     'label' => 'Name',
     'validation' => array('required', 'max_length'=>array(100), 'min_length'=>array(10)) //validation rules
  ),
  'username' => array(
     'data_type' => 'string',
     'label' => 'Username',
     'validation' => array('required', 'unique') // does this work?
  )
)

如果有一个名为"unique"的框架定义的验证规则,这将起作用。但事实并非如此。

文档中有一个示例(http://docs.fuelphp.com/classes/validation/validation.html#/extending_validation)它解释了如何添加自定义规则,并以"unique"为例。

我遇到了一个问题,排除了我正在更新的当前记录。所以为了解决这个问题,我"黑"了它一点。

这适用于Model_Crud,它应该在稍作调整的情况下适用于其他应用。

规则(在model/mymodel.php中):

protected static $_rules = array(
  'uniqueField' => 'unique[Model_Product,code]', //unique[Model,fieldToCheck]
);

方法(在myvalidation.php中):

public static function _validation_unique($val, $model, $field)
{
  if (empty($val))
    return true;
  $findOpts = array(
    'where' => array(
      array($field, '=', $val)
    )
  );
  $input = 'Validation::active()->input();
  if (! empty($input['id']))
    $findOpts['where'][] = array('id', '<>', $input['id']);
  'Validation::active()->set_message('unique', 'The field :label must be unique, but :value has already been used');
  //Model_Crud provides a find method which I use to find any of the duplicates
  $obj = call_user_func(array($model, 'find'), $findOpts);
  return ! count($obj) > 0;
}