Laravel で「開始日時 < 終了日時」であることをバリデーションする
はじめに
Laravelで「開始日時」と「終了日時」を登録する際に、日付と時刻の入力欄がそれぞれに用意されているようなケースで、「開始日時 < 終了日時」であることをバリデーションする方法。
追記: こっちのやり方使った方が良いかも。
Laravel でコンマ区切りのフォームデータを良い感じにバリデーションする
TL;DR
- クロージャ内で日時データを組み立てて比較することで解決(暫定)
- 他にも色々と試したけどダメだった
- Laravel 歴が浅いので鵜呑みにしないこと
- この方法 の方が良いかも
目次
環境・条件
1 | $ sw_vers |
詳細
やりたいこと
「開始日時」と「終了日時」を登録する際、日付と時刻の入力欄がそれぞれに用意されているようなケースにおいて、「開始日時 < 終了日時」であることをバリデーションしたい。
some/form.blade.php
1 | <form action="/hoge" method="POST"> |
解決策(暫定)
end_time
のバリデーション最後でクロージャを使って、中で日時データを組み立てて比較するようにした。
1 | public function rules() |
イケてない点
'end_time'
のエラーとなるので、エラーとなった入力欄を強調表示(Bootstrap の class="is-invalid"
付与など)する際には、start_date
, start_time
, end_date
でも $errors->has('end_time')
を見ないといけない。
1 | <form action="/hoge" method="POST"> |
※上記例では特にメッセージ表示やフォームの強調表示は行っておらず、どのように影響があるかのみを示している。
その他 試したこと
備忘のためにも残しておく。
rules にパラメータを追加
$this->request->parameters
にフォームパラメータが詰まっているので、rules
の中で $xxxx_datetime
として組み上げて $this->request->parameters
に追加すれば良きに計らってくれることを期待したがダメだった。
$this->request->parameters
は protected
なフィールドだが、add
メソッドがあるので $this->request->add()
でフィールドを追加できる。
あとは after_of_equal
や before_or_equal
で比較。
という予定だったが、$this->request->add()
でフィールドを追加しても、追加する場所やタイミングの問題なのか、"start_datetime" は必須です。
とエラーになる。
1 | public function rules() |
上手くいけば、これが一番キレイっぽかっただけに残念…
withValidator でゴニョゴニョ
withValidator
で $validator->after()
とか使ってどうにかできないかな、と色々と調べたり試したりしたけど何も思いつかなかった。
まとめ
- クロージャ内で日時データを組み立てて比較することで解決(暫定)
- 他にも色々と試したけどダメだった
- Laravel 歴が浅いので鵜呑みにしないこと
- この方法 の方が良いかも
その他・メモ
他のやり方としては JS を使って、start_datetime
, end_datetime
フィールドを hidden
で埋め込んでおくとかだと思う。
参考文献
- バリデーション 5.8 Laravel
- php - How to parse datetime using Laravel on date and time? - Stack Overflow
- php - Laravel 5.3 date validator: equal to or after start_date - Stack Overflow
- How can I set comparison datetime in validation laravel? - Stack Overflow
- php - Laravel 5: How to validate datetime input from 4 input fields? - Stack Overflow
- Laravel5.2 日付Validationのフォーマット - Qiita
- Laravelで複数フィールドを組み合わせてバリデーションした時のメモ - write ahead log
- laravel5.6, 5.7 独自のバリデーションルールを追加しよう! | のるぼるのるの
関連記事
- Laravel で現在の URL 取得方法まとめ
- Laravel で Cookie を使う(参照/設定/削除)
- Laravel で PDF ファイルをブラウザで開く
- Laravel で withCount と having を使って絞り込み
- Laravel で生 SQL を実行
- Laravel で有効期限付きの一次的な URL を生成してメールで送信する
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア