Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Model CakePHP z datami między

Jeśli prawidłowo Cię śledzę:

  • Użytkownik musi określić daty rozpoczęcia/zakończenia wyszukiwania zapytań generowanych z formularza
  • Musisz potwierdzić te daty, aby na przykład:
    • data zakończenia po dacie rozpoczęcia
    • data końcowa nie odbiegająca o wieki od daty rozpoczęcia
  • Chcesz, aby błędy walidacji pojawiały się w tekście w formularzu (nawet jeśli nie jest to zapis)

Ponieważ chcesz zweryfikować te daty, będą one trudniejsze do uchwycenia, gdy zostaną schowane w tablicy warunków. Proponuję spróbować przekazać je osobno, a następnie zająć się nimi później:

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

Miejmy nadzieję, że powinieneś być w stanie obsłużyć wszystko inne w 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;
}

Nie próbowałem używać Model::invalidate() podczas operacji wyszukiwania, więc może to nawet nie zadziałać. Chodzi o to, że jeśli formularz jest tworzony przy użyciu FormHelper te wiadomości powinny wrócić obok pól formularza.

Jeśli to się nie powiedzie, być może będziesz musiał przeprowadzić tę walidację w kontrolerze i użyć Session::setFlash() . jeśli tak, możesz również pozbyć się beforeFind i umieść BETWEEN tablica warunków z innymi warunkami.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django MySQL grupuj według dnia ze strefą czasową

  2. Jak wyszukiwać nazwy zaczynające się na literę A w MySQL?

  3. Łączenie się z MySQL powoduje błąd Nie znaleziono nazwy źródła danych i nie określono domyślnego sterownika

  4. Procedury składowane w Ruby on Rails

  5. Jaki jest najlepszy sposób przechowywania historycznego cennika w tabeli MySQL?