sql >> Database >  >> RDS >> Mysql

CakePHP-model met tussendatums

Als ik je goed volg:

  • De gebruiker moet begin- en einddatums opgeven voor zoekquery's die zijn gegenereerd op basis van een formulier
  • U moet deze datums valideren zodat bijvoorbeeld:
    • einddatum na startdatum
    • einddatum niet eeuwen verwijderd van startdatum
  • U wilt dat validatiefouten inline in het formulier verschijnen (ook al is dit geen opslag)

Aangezien u deze datums wilt valideren, zijn ze moeilijker te pakken als ze zijn weggestopt in uw voorwaardenarray. Ik raad aan om deze apart door te geven en ze later te behandelen:

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

Je zou hopelijk in staat moeten zijn om al het andere in de beforeFind . te verwerken filter:

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;
}

Ik heb niet geprobeerd Model::invalidate() . te gebruiken tijdens een zoekbewerking, dus dit werkt misschien niet eens. Het idee is dat als het formulier is gemaakt met behulp van FormHelper deze berichten zouden terug moeten komen naast de formuliervelden.

Als dat niet lukt, moet u deze validatie mogelijk in de controller uitvoeren en Session::setFlash() gebruiken . als dat zo is, kun je ook de beforeFind . verwijderen en zet de BETWEEN condition array in met uw andere voorwaarden.



  1. Grant op meerdere databases. MySQL

  2. org.hibernate.HibernateException:de database heeft geen native gegenereerde identiteitswaarde geretourneerd

  3. SQL Express installeren

  4. Verbinding Toegang geweigerd voor gebruiker www-data