sql >> Databáze >  >> RDS >> Mysql

CakePHP model s mezi daty

Pokud vás sleduji správně:

  • Uživatel musí zadat počáteční/koncové datum pro vyhledávací dotazy generované z formuláře
  • Je třeba ověřit tato data, aby například:
    • datum ukončení po datu zahájení
    • datum ukončení není století vzdálené od data zahájení
  • Chcete, aby se chyby ověření zobrazovaly přímo ve formuláři (i když se nejedná o uložení)

Vzhledem k tomu, že chcete tato data ověřit, bude těžší je chytit, když jsou schovaná v poli vašich podmínek. Navrhuji pokusit se je předat samostatně a pak se s nimi vypořádat později:

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

Doufejme, že byste měli být schopni zvládnout vše ostatní v beforeFind filtr:

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

Nezkoušel jsem použít Model::invalidate() během operace hledání, takže to ani nemusí fungovat. Myšlenka je taková, že pokud je formulář vytvořen pomocí FormHelper tyto zprávy by se měly vrátit zpět k polím formuláře.

Pokud se tak nestane, možná budete muset provést toto ověření v ovladači a použít Session::setFlash() . pokud ano, můžete se také zbavit beforeFind a vložte BETWEEN podmínky pole s vašimi dalšími podmínkami.



  1. HOUR() vs EXTRACT(HOUR …) v MariaDB:Jaký je rozdíl?

  2. Django manytomany dotaz podivné chování

  3. Laravel Eloquent získá výsledky seskupené podle dnů

  4. Alternativní ovladače Oracle pro .net