Mysql
 sql >> Datenbank >  >> RDS >> Mysql

CakePHP-Modell mit Zwischendaten

Wenn ich dir richtig folge:

  • Der Benutzer muss Start-/Enddaten für aus einem Formular generierte Suchabfragen angeben
  • Sie müssen diese Daten validieren, damit zum Beispiel:
    • Enddatum nach Startdatum
    • Enddatum nicht Jahrhunderte vom Startdatum entfernt
  • Sie möchten, dass Validierungsfehler innerhalb des Formulars angezeigt werden (obwohl dies keine Speicherung ist)

Da Sie diese Daten validieren möchten, sind sie schwieriger zu erfassen, wenn sie in Ihrem Bedingungs-Array versteckt sind. Ich schlage vor, diese separat einzureichen und sich dann später darum zu kümmern:

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

Sie sollten hoffentlich in der Lage sein, alles andere in beforeFind zu handhaben filtern:

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

Ich habe nicht versucht, Model::invalidate() zu verwenden während einer Suchoperation, sodass dies möglicherweise nicht einmal funktioniert. Die Idee ist, dass wenn das Formular mit FormHelper erstellt wird diese Nachrichten sollten neben den Formularfeldern erscheinen.

Andernfalls müssen Sie diese Validierung möglicherweise im Controller durchführen und Session::setFlash() verwenden . Wenn ja, können Sie auch beforeFind loswerden und setzen Sie den BETWEEN Bedingungs-Array mit Ihren anderen Bedingungen.