zend-framework validation zend-db

zend framework - Zend_Validate_Db_RecordExists contra 2 campos



zend-framework validation (6)

Usualmente uso Zend_Validate_Db_RecordExists para actualizar o insertar un registro. Esto funciona bien con un campo para verificar. ¿Cómo hacerlo si tiene dos campos para verificar?

$validator = new Zend_Validate_Db_RecordExists( array( ''table'' => $this->_name, ''field'' => ''id_sector,day_of_week'' ) ); if ($validator->isValid($fields_values[''id_sector''],$fields_values[''day_of_week''])){ //true }

Lo intenté con una matriz y una lista separada por comas, nada funciona ... Cualquier ayuda es bienvenida. Saludos Andrea


Para hacer esto, tendrías que extender la clase Zend_Validate_Db_RecordExists.

Actualmente no sabe cómo verificar la existencia de más de un campo.

Puede usar dos instancias de validador diferentes para verificar los dos campos por separado. Este es el único trabajo que puedo ver ahora además de extenderlo.

Si eliges extenderlo, entonces tendrás que encontrar la forma de pasar todos los campos al constructor (la matriz parece una buena opción), y luego tendrás que profundizar en el método que crea la consulta sql. En este método, tendrá que recorrer la matriz de campos que se pasaron al constructor.


Debería considerar usar el parámetro exclude . Algo como esto debería hacer lo que quieras:

$validator = new Zend_Validate_Db_RecordExists( array( ''table'' => $this->_name, ''field'' => ''id_sector'', ''exclude'' => array( ''field'' => ''day_of_week'', ''value'' => $fields_values[''day_of_week''] ) );

El campo de exclusión se agregará efectivamente a la parte WHERE generada automáticamente para crear algo equivalente a esto:

WHERE `id_sector` = $fields_values[''id_sector''] AND `day_of_week` = $fields_values[''day_of_week'']

Es una especie de hack en el sentido de que lo estamos usando para lo contrario de lo que se pretendía, pero funciona para mí de forma similar (lo estoy usando con Db_NoRecordExists ).

Fuente: ejemplo Zend_Validate_Db_NoRecordExists


$dbAdapter = Zend_Db_Table::getDefaultAdapter(); ''validators'' => array(''EmailAddress'', $obj= new Zend_Validate_Db_NoRecordExists(array(''adapter''=>$dbAdapter, ''field''=>''email'', ''table''=>''user'', ''exclude''=>array(''field''=>''email'',''value''=>$this->_options[''email''], ''field''=>''is_deleted'', ''value''=>''1'') ))),


Lo siento por la respuesta tardía.

La mejor opción que funcionó para mí es esta:

// create an instance of the Zend_Validate_Db_RecordExists class // pass in the database table name and the first field (as usual)... $validator = new Zend_Validate_Db_RecordExists(array( ''table'' => ''tablename'', ''field'' => ''first_field'' )); // reset the where clause used by Zend_Validate_Db_RecordExists $validator->getSelect()->reset(''where''); // set again the first field and the second field. // :value is a named parameter that will be substituted // by the value passed to the isValid method $validator->getSelect()->where(''first_field = ?'', $first_field); $validator->getSelect()->where(''second_field = :value'', $second_field); // add your new record exist based on 2 fields validator to your element. $element = new Zend_Form_Element_Text(''element''); $element->addValidator($validator); // add the validated element to the form. $form->addElement($element);

Espero que eso ayude a alguien :)

Aunque, recomendaría encarecidamente una solución más ordenada que sería ampliar la clase Zend_Validate_Db_RecordExists con el código anterior.

¡¡Disfrutar!! Rosario


Para aquellos que usan Zend 2, si desea verificar si el usuario con una id y email existe en los users tabla, es posible de esta manera.

En primer lugar, crea el objeto de selección que se usará como parámetro para el objeto Zend/Validator/Db/RecordExists

$select = new Zend/Db/Sql/Select(); $select->from(''users'') ->where->equalTo(''id'', $user_id) ->where->equalTo(''email'', $email);

Ahora, crea el objeto RecordExists y comprueba la existencia de esta manera

$validator = new Zend/Validator/Db/RecordExists($select); $validator->setAdapter($dbAdapter); if ($validator->isValid($username)) { echo ''This user is valid''; } else { //get and display errors $messages = $validator->getMessages(); foreach ($messages as $message) { echo "$message/n"; } }

Esta muestra es del documento oficial de ZF2


Puede usar la ''exclusión'' en este parámetro para pasar la segunda cláusula por la que desea filtrar.

$clause = ''table.field2 = value''; $validator = new Zend_Validate_Db_RecordExists( array( ''table'' => ''table'', ''field'' => ''field1'', ''exclude'' => $clause ) ); if ($validator->isValid(''value'') { true; }