Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Modelo CakePHP com datas intermediárias


Se estou te seguindo corretamente:
  • O usuário deve especificar as datas de início/término das consultas de busca geradas a partir de um formulário
  • Você precisa validar essas datas para que, por exemplo:
    • data de término após a data de início
    • data de término não há séculos da data de início
  • Você deseja que os erros de validação apareçam embutidos no formulário (mesmo que isso não seja um salvamento)

Como você deseja validar essas datas, elas serão mais difíceis de pegar quando estiverem escondidas dentro do seu array de condições. Sugiro tentar passá-los separadamente e depois lidar com eles mais tarde:
$this->Model->find('all', array(
    'conditions' => array(/* normal conditions here */),
    'dateRange' => array(
        'start' => /* start_date value */,
        'end'   => /* end_date value */,
    ),
));

Você deve ser capaz de lidar com todo o resto no 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;
}

Eu não tentei usar Model::invalidate() durante uma operação de busca, então isso pode nem funcionar. A ideia é que se o formulário for criado usando FormHelper essas mensagens devem retornar ao lado dos campos do formulário.

Caso contrário, você pode precisar realizar essa validação no controlador e usar Session::setFlash() . em caso afirmativo, você também pode se livrar do beforeFind e coloque o BETWEEN array de condições com suas outras condições.