sql >> Databasteknik >  >> RDS >> Mysql

CakePHP-modell med mellan datum

Om jag följer dig rätt:

  • Användaren måste ange start-/slutdatum för sökfrågor som genereras från ett formulär
  • Du måste validera dessa datum så att till exempel:
    • slutdatum efter startdatum
    • slutdatum inte århundraden från startdatumet
  • Du vill att valideringsfel ska visas inline i formuläret (även om detta inte är en lagring)

Eftersom du vill validera dessa datum blir de svårare att få tag på när de är undangömt i din villkorsuppsättning. Jag föreslår att du försöker skicka in dessa separat och sedan ta itu med dem senare:

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

Du bör förhoppningsvis kunna hantera allt annat i beforeFind 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;
}

Jag har inte testat att använda Model::invalidate() under en sökoperation, så det kanske inte ens fungerar. Tanken är att om formuläret skapas med FormHelper dessa meddelanden bör komma tillbaka bredvid formulärfälten.

Om det misslyckas kan du behöva utföra denna validering i styrenheten och använda Session::setFlash() . i så fall kan du också bli av med beforeFind och sätt BETWEEN condition array tillsammans med dina andra villkor.



  1. Varför behöver jag fortfarande MySQL Connector installerad på datorn trots att jag har rätt NuGet-paket?

  2. T-SQL för att hitta fjärrservernamnet på den länkade servern

  3. Gruppera poster från while loop | PHP

  4. Få aktuellt år, aktuell månad och aktuell dag i MySQL