validator validate type enable array yii yii-validation

validate - yii2 rules type



yii: cómo hacer una regla única para dos atributos (8)

En Yii2:

public function rules() { return [ [[''name''], ''unique'', ''targetAttribute'' => [''name'', ''version'']], ]; }

Tengo una tabla como esta: (id, nombre, versión, texto). (nombre, versión) es una clave única, ¿cómo puedo hacer una regla para validar esto?


En función de la función anterior, aquí hay una función que puede agregar a su modelo ActiveRecord

Lo usarías así,

array( array(''productname,productversion''), ''ValidateUniqueColumns'', ''Product already contains that version''), /* * Validates the uniqueness of the attributes, multiple attributes */ public function ValidateUniqueColumns($attributes, $params) { $columns = explode(",", $attributes); //Create the SQL Statement $select_criteria = ""; $column_count = count($columns); $lastcolumn = ""; for($index=0; $index<$column_count; $index++) { $lastcolumn = $columns[$index]; $value = Yii::app()->db->quoteValue( $this->getAttribute($columns[$index]) ); $column_equals = "`".$columns[$index]."` = ".$value.""; $select_criteria = $select_criteria.$column_equals; $select_criteria = $select_criteria." "; if($index + 1 < $column_count) { $select_criteria = $select_criteria." AND "; } } $select_criteria = $select_criteria." AND `".$this->getTableSchema()->primaryKey."` <> ".Yii::app()->db->quoteValue($this->getAttribute( $this->getTableSchema()->primaryKey )).""; $SQL = " SELECT COUNT(`".$this->getTableSchema()->primaryKey."`) AS COUNT_ FROM `".$this->tableName()."` WHERE ".$select_criteria; $list = Yii::app()->db->createCommand($SQL)->queryAll(); $total = intval( $list[0]["COUNT_"] ); if($total > 0) { $this->addError($lastcolumn, $params[0]); return false; } return true; }


Es muy fácil. En su matriz, incluya un parámetro creado en su clase de extensiones.

El siguiente código está dentro de Model.

array(''name'', ''ext.ValidateNames'', ''with''=>''lastname'')

El siguiente código es de la clase ValidateNames en la carpeta de extensiones.

class ValidateNames extends CValidator { public $with=""; /*my parameter*/ public function validateAttribute($object, $attribute) { $temp = $this->with; $lastname = $object->$temp; $name = $object->$attribute; $this->addError($object,$attribute, $usuario." hola ".$lastname); } }


Han agregado soporte para claves compuestas únicas en la próxima versión candidata de Yii1.14rc, pero aquí hay (otra) solución. Por cierto, este código usa el mismo ''attributeName'' en las reglas que usará el framework Yii en el próximo lanzamiento oficial.

protected / models / Mymodel.php

public function rules() { return array( array(''name'', ''uniqueValidator'',''attributeName''=>array( ''name'', ''phone_number'',''email'') ), ...

  • ''nombre'' al comienzo de la regla es el atributo al que se adjuntará el error de validación y luego se publicará en su formulario.
  • ''attributeName'' (array) contiene una matriz de claves que le gustaría validar juntas como una clave combinada.

protected / components / validators / uniqueValidator.php

class uniqueValidator extends CValidator { public $attributeName; public $quiet = false; //future bool for quiet validation error -->not complete /** * Validates the attribute of the object. * If there is any error, the error message is added to the object. * @param CModel $object the object being validated * @param string $attribute the attribute being validated */ protected function validateAttribute($object,$attribute) { // build criteria from attribute(s) using Yii CDbCriteria $criteria=new CDbCriteria(); foreach ( $this->attributeName as $name ) $criteria->addSearchCondition( $name, $object->$name, false ); // use exists with $criteria to check if the supplied keys combined are unique if ( $object->exists( $criteria ) ) { $this->addError($object,$attribute, $object->label() .'' '' . $attribute .'' "''. $object->$attribute . ''" has already been taken.''); } } }

Puede usar tantos atributos como desee y esto funcionará para todos sus CModels. El control se hace con "existe".

protected / config / main.php

''application.components.validators.*'',

Puede que tenga que agregar la línea anterior a su configuración en la matriz de ''importación'' para que la aplicación Yii encuentre uniqueValidator.php.

Comentarios positivos y cambios son bienvenidos!


No necesita un contenido complicado del método rules () ni de extensiones de terceros. Solo crea tu propio método de validación. Es mucho más fácil hacerlo por tu cuenta.

public function rules() { return array( array(''firstField'', ''myTestUniqueMethod''), ); } public function myTestUniqueMethod($attribute,$params) { //... and here your own pure SQL or ActiveRecord test .. // usage: // $this->firstField; // $this->secondField; // SELECT * FROM myTable WHERE firstField = $this->firstField AND secondField = $this->secondField ... // If result not empty ... error if (!$isUnique) { $this->addError(''firstField'', "Text of error"); $this->addError(''secondField'', "Text of error"); } }


Puede ser que puedas agregar estas rules a tu código

return array( array(''name'', ''unique'', ''className''=>''MyModel'', ''attributeName''=>''myName''), array(''version'', ''unique'', ''className''=>''MyModel'', ''attributeName''=>''myVersion'') );


Yii1:

http://www.yiiframework.com/extension/composite-unique-key-validatable/

Yii2:

// a1 needs to be unique [''a1'', ''unique''] // a1 needs to be unique, but column a2 will be used to check the uniqueness of the a1 value [''a1'', ''unique'', ''targetAttribute'' => ''a2''] // a1 and a2 need to be unique together, and they both will receive error message [[''a1'', ''a2''], ''unique'', ''targetAttribute'' => [''a1'', ''a2'']] // a1 and a2 need to be unique together, only a1 will receive error message [''a1'', ''unique'', ''targetAttribute'' => [''a1'', ''a2'']] // a1 needs to be unique by checking the uniqueness of both a2 and a3 (using a1 value) [''a1'', ''unique'', ''targetAttribute'' => [''a2'', ''a1'' => ''a3'']]

http://www.yiiframework.com/doc-2.0/yii-validators-uniquevalidator.html


Esto puede hacerlo el propio Yii, no necesita una extensión para él. Sin embargo, una extensión puede ayudar a limpiar el método rules() como se describe aquí:

http://www.yiiframework.com/extension/unique-attributes-validator/

Este es el código (copiado de ese sitio) que funcionará sin usar la extensión:

public function rules() { return array( array(''firstKey'', ''unique'', ''criteria''=>array( ''condition''=>''`secondKey`=:secondKey'', ''params''=>array( '':secondKey''=>$this->secondKey ) )), ); }

En caso de que el valor de $this->secondKey no esté disponible dentro de rules() -method puede agregar el validador en CActiveRecords beforeValidate() -method así:

public function beforeValidate() { if (parent::beforeValidate()) { $validator = CValidator::createValidator(''unique'', $this, ''firstKey'', array( ''criteria'' => array( ''condition''=>''`secondKey`=:secondKey'', ''params''=>array( '':secondKey''=>$this->secondKey ) ) )); $this->getValidatorList()->insertAt(0, $validator); return true; } return false; }