sql >> Base de Datos >  >> RDS >> Mysql

Modelo CakePHP con entre fechas

Si te estoy siguiendo correctamente:

  • El usuario debe especificar las fechas de inicio/finalización de las consultas de búsqueda generadas a partir de un formulario
  • Debe validar estas fechas para que, por ejemplo:
    • fecha de finalización después de la fecha de inicio
    • la fecha de finalización no está a siglos de distancia de la fecha de inicio
  • Desea que los errores de validación aparezcan en línea dentro del formulario (aunque esto no es un guardado)

Dado que desea validar estas fechas, será más difícil obtenerlas cuando estén escondidas dentro de su conjunto de condiciones. Sugiero tratar de pasarlos por separado y luego tratar con ellos más tarde:

$this->Model->find('all', array(
    'conditions' => array(/* normal conditions here */),
    'dateRange' => array(
        'start' => /* start_date value */,
        'end'   => /* end_date value */,
    ),
));

Con suerte, debería poder manejar todo lo demás en beforeFind filtro:

public function beforeFind() {
    // perform query validation
    if ($queryData['dateRange']['end'] < $queryData['dateRange']['start']) {
        $this->invalidate(
            /* end_date field name */,
            "End date must be after start date"
        );
        return false;
    }
    /* repeat for other validation */
    // add between condition to query
    $queryData['conditions'][] = array(
        'Model.dateField BETWEEN ? AND ?' => array(
            $queryData['dateRange']['start'],
            $queryData['dateRange']['end'],
        ),
    );
    unset($queryData['dateRange']);
    // proceed with find
    return true;
}

No he intentado usar Model::invalidate() durante una operación de búsqueda, por lo que es posible que esto ni siquiera funcione. La idea es que si el formulario se crea usando FormHelper estos mensajes deberían volver a aparecer junto a los campos del formulario.

De lo contrario, es posible que deba realizar esta validación en el controlador y usar Session::setFlash() . si es así, también puede deshacerse de beforeFind y pon el BETWEEN matriz de condiciones con sus otras condiciones.