sql >> データベース >  >> RDS >> Mysql

日付の間にあるCakePHPモデル

    私があなたを正しくフォローしている場合:

    • ユーザーは、フォームから生成された検索クエリの開始日/終了日を指定する必要があります
    • 次のように、これらの日付を検証する必要があります。
      • 開始日後の終了日
      • 開始日から数世紀離れていない終了日
    • 検証エラーをフォーム内にインラインで表示する必要があります(これは保存ではありませんが)

    これらの日付を検証したいので、条件配列内に隠れていると、それらを取得するのが難しくなります。これらを個別に渡して、後で処理することをお勧めします:

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

    うまくいけば、beforeFindで他のすべてを処理できるはずです。 フィルタ:

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

    Model::invalidate()を使用したことはありません 検索操作中なので、これも機能しない可能性があります。フォームがFormHelperを使用して作成されている場合の考え方 これらのメッセージは、フォームフィールドの横に戻るはずです。

    それができない場合は、コントローラーでこの検証を実行し、Session::setFlash()を使用する必要があります。 。その場合は、beforeFindを削除することもできます BETWEENを配置します 条件配列を他の条件と組み合わせます。



    1. 投稿する前にデータをオフラインで保存する

    2. java.net.SocketInputStream.socketRead0(ネイティブメソッド)でスレッドがハングしました。何が起こったのか誰もが知っていますか?

    3. SQL Serverでグローバル変数を宣言する方法..?

    4. PostgreSQL9.2でテーブルをロックせずにデータベース行を更新する