2010-08-10 14 views
6

Estoy seguro de que no soy el primero que tiene claves únicas compuestas en las tablas y que quiere validarlas. No quiero inventar la bicicleta, así que pregunto aquí primero. Tengo varias tablas que tienen columnas 'id' como claves primarias y otras dos columnas como claves compuestas únicas. Sería bueno tener una regla de validación para verificar que la entrada enviada sea única y mostrar un error de validación si no lo es. En Cakephp podría hacerse mediante una regla de validación personalizada. Estoy bastante seguro de que alguien ya creó ese método.Regla de validación para un índice único compuesto (no primario)

Idealmente, sería un método en app_model.php que podría ser utilizado por diferentes modelos.

Respuesta

11

estoy usando esa función:

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); 
    } 

básicamente el uso es:

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

Así que, básicamente, esto mostrará la advertencia sobre ello en cada uno de los campos que dicen que no es única.

Estoy usando esto mucho y está funcionando correctamente.

+0

¡Gracias! Eso es exactamente lo que quería. El único punto de salida es que produce 2 consultas idénticas cuando se validan 2 campos. – bancer

-1

Podría ponerlo en el modelo de la aplicación, pero mi sugerencia sería simplemente agregarlo al modelo directamente colocando la regla con su propiedad $validate.

Eche un vistazo al built in isUnique rule.

+0

'isUnique' valida solo un campo para una sola columna. Necesito la regla de validación para dos columnas que componen la clave única compuesta. – bancer

+0

Ya veo. Lo siento. Entonces sí, si esto es algo en varios modelos, crearía una regla de validación personalizada y la pondría en app_model.php. –

0

En las versiones de CakePHP/2.x liberados en los últimos años, the isUnique rule acepta opcionalmente varias columnas:

Puede validar que un conjunto de campos son únicos proporcionando múltiples campos y establecer $or a false:

public $validate = array(
    'email' => array(
     'rule' => array('isUnique', array('email', 'username'), false), 
     'message' => 'This username & email combination has already been used.' 
    ) 
); 

no estoy seguro de la versión exacta cuando la característica estaba disponible pero hay a bug fijado en núcleo tan tarde como octubre de 2014 presentado contra 2.3 y 2.4 sucursales.

Cuestiones relacionadas