🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

6373閲覧

Laravel 5.8で配列のリクエストのバリデーションができません

natsume2233

総合スコア225

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/10/28 07:11

前提・実現したいこと

Laravel5.8で勤怠システムを作成しています。
テーブルの形で、出勤時間、退勤時間、合計時間、作業内容、プロジェクトコードに入力欄があります。

formは下記のようになっています。(inputが入力欄の想定)

出勤時間退勤時間合計時間作業内容プロジェクトコード
inputinputinputinputinput
inputinputinputinputinput
inputinputinputinputinput

行は複数行同時登録可能な仕様です。
それを、登録のためPOSTした際のバリデーションで
1行目は必須、2行目は出勤時間があれば、退勤時間必須...のようにバリデーションをかけたいです。

発生している問題・エラーメッセージ

POSTした際に、何も入力していない場合、nullの配列が送られ、思うようにバリデーションがかかりません。

イメージ説明

該当のソースコード

ここでは10個決め打ちしていますが実際は何個になるか不明です。

Blade

HTML

1<table class="table white-space-nowrap"> 2 <thead> 3 <tr> 4 <th scope="col">出勤時間</th> 5 <th scope="col">退勤時間</th> 6 <th scope="col">合計</th> 7 <th scope="col">作業内容</th> 8 <th scope="col">pj番号</th> 9 </tr> 10 </thead> 11 <tbody> 12 @for ($i = 0; $i < 10; $i++) <tr> 13 <td> 14 <input type="text" placeholder="00:00" name="start_time[]"> 15 </td> 16 <td> 17 <input type="text" placeholder="00:00" name="end_time[]"> 18 </td> 19 20 <td class="input-size-s"> 21 <input type="text" name="sum_time[]" disabled="disabled" placeholder="合計"> 22 </td> 23 <td> 24 <input type="text" placeholder="作業内容" name="work_content[]"> 25 </td> 26 <td> 27 <input type="text" disabled="disabled" name="pj_num[]" placeholder="pj番号"> 28 </td> 29 </tr> 30 @endfor 31 </tbody> 32</table>

FormRequest

PHP:

1 public function rules() 2 { 3 return [ 4 'start_time' => 'required|array|min:1|', 5 'start_time.*' => 'nullable|date_format:H:i|', 6 'end_time' => 'required|array|min:1', 7 'end_time.*' => 'required_with:start_time.*|date_format:H:i|after:start_time.*', 8 'sum_time' => 'required|array|min:1|', 9 'sum_time.*' => 'required_with:start_time.*|date_format:H:i|', 10 ]; 11 }

試したこと

バリデーションがかかる前に、array_filterでnullを削除しようとしましたが、全部からだとエラーが出てうまくできていません。

大変申し訳ありませんが、お力を貸していただけますと助かります。
初めての質問で不備等ありましたら追記しますので、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

start_timeとend_timeをについて、

・1行目が必須
・2行目以降は、start_timeがあれば、end_timeも

なら下記でいけるはず・・。

php

1'start_time.0' => 'required', 2'end_time.0' => 'required', 3'start_time.*' => 'nullable|date_format:H:i', 4'end_time.*' => 'required_with:start_time.*|nullable|date_format:H:i|after:start_time.*',

提示のbladeを見る限り、inputのnameが配列形式(***[])なので、1行目の必須は「0」指定で書いてしまいます。

なお、「0」もそれ以外「.」も共通でチェックしたいもの(時間の形式など)は、
「.
」の方に書いておけば「0」もチェックされるので、「0」はrequiredのみで問題ないとおもいます。(※)

(※)動作確認をlaravel6.0で行ったので、もし挙動が違った場合はすみません^^;


それと、質問の本筋とは関係ありませんが、
nullを許容する可能性のある項目には、全てnullableも並記しておいた方が良いですよ。

質問に提示されたコードより、下記のルールを例にあげますと、

php

1'sum_time.*' => 'required_with:start_time.*|date_format:H:i|',

sun_time[1]を、空のまま送信したとします。

start_time[1]がなければ、required_withのバリデーションチェックは通りますが、nullableが設定されていない為、次のdate_formatが空の送信値nullに対して実行され、バリデーションエラーになってしまいます。

以上、ご参考までに・・。

投稿2019/11/01 02:53

mix-peach

総合スコア1910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natsume2233

2019/11/05 02:51

できました!有難うございました とても勉強になりました。 補足事項つけて頂き有難うございます、まさにそこにも引っかかっていたようです 助かりました。有難うございます
guest

0

ある項目に入力あった場合は他の項目も必要
みたいなのがしたいならバリデーションのrequired_withを駆使したらいけそうな気がします

バリデーション 5.8 Laravel

投稿2019/10/28 07:38

sola-msr

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natsume2233

2019/10/28 10:00

回答ありがとうございます 既に使用していますが、POSTしたデータがnullでも配列として存在しているため機能していません... 回答有難うございました
guest

0

出勤時間があれば、退勤時間必須...

以下のサイトが参考になるかと思います。
※Laravelのバージョンは違いますが、大丈夫かと…

https://www.larajapan.com/2016/10/23/バリデーション-8-配列をバリデーションする/

投稿2019/10/28 07:22

meshi_s

総合スコア276

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natsume2233

2019/10/28 10:05 編集

回答ありがとうございます こちらを参考に実装したものなのですが、うまくいかず... また考えてみます 回答有難うございました
guest

0

自動バリデートではなく、カスタムバリデート組む形になると思います。
カスタムというか、行個々にバリデートするかしないか決める形。
つまり、「その行でひとつでも入力があれば」を条件にしてバリデート通すイメージですね。

投稿2019/10/28 07:18

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問