Mysql
 sql >> Database >  >> RDS >> Mysql

Modello CakePHP con date intermedie

Se ti seguo correttamente:

  • L'utente deve specificare le date di inizio/fine per le query di ricerca generate da un modulo
  • Devi convalidare queste date in modo che, ad esempio:
    • data di fine dopo la data di inizio
    • data di fine non lontana secoli dalla data di inizio
  • Vuoi che gli errori di convalida appaiano in linea all'interno del modulo (anche se questo non è un salvataggio)

Dal momento che vuoi convalidare queste date, saranno più difficili da afferrare quando sono nascoste all'interno dell'array delle condizioni. Suggerisco di provare a passarli separatamente e poi affrontarli in un secondo momento:

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

Si spera che dovresti essere in grado di gestire tutto il resto in 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;
}

Non ho provato a usare Model::invalidate() durante un'operazione di ricerca, quindi potrebbe anche non funzionare. L'idea è che se il modulo viene creato utilizzando FormHelper questi messaggi dovrebbero tornare accanto ai campi del modulo.

In caso contrario, potrebbe essere necessario eseguire questa convalida nel controller e utilizzare Session::setFlash() . in tal caso, puoi anche sbarazzarti di beforeFind e inserisci BETWEEN array di condizioni con le altre condizioni.