laravelでフォームのバリデーションを実装していると、
「配列の値をどうやってバリデーションすればいいのかわからない」
と悩んだことはありませんか?
単一の値であれば問題なく書けるバリデーションも、
「input name=”XXX[]”」や配列形式になると急に難しく感じてしまいます。
この記事では、laravelで配列を扱う際のバリデーション方法を、
実例を交えながら紹介していきます。
目次
実装
実装の流れ
- 同一の情報が複数含まれるフォームを作成する
- 配列でのバリデーションを実装する
今回はルートは省略しております。
フォームの作成

inputタグのnameプロパティに「name=”XXX[]”」とし、配列でpostできるように設定します。
<h3>テストフォーム</h3>
{{-- メッセージ --}}
@foreach ($errors->all() as $error)
<div style="color: red;">{{$error}}</div>
@endforeach
// posttestメソッドへ
<form action="{{ route('posttest') }}" method="POST">
@csrf
<table>
<tr>
<th>ID</th>
<th>名前</th>
<th>年齢</th>
</tr>
@foreach ($dataList as $key => $data)
<tr>
<td>
{{$data['id']}}
// name=XXX[]とし、配列でpostする
<input type="hidden" name="id[]" value="{{$data['id']}}">
</td>
<td>
// name=XXX[]とし、配列でpostする
<input type="text" name="name[]" value="{{old("name.$key", $data['name'])}}">
</td>
<td>
// name=XXX[]とし、配列でpostする
<input type="text" name="age[]" value="{{old("age.$key", $data['age'])}}">
</td>
</tr>
@endforeach
</table>
<input type="submit" value="送信">
</form>oldヘルパーの第二引数に、初期表示するデータを指定します。
controller 配列バリデーション実装
配列に対してバリデーションをする方法は、バリデーションメソッドの連想配列のキーに「nameプロパティ.*」を定義するだけです。
例として、以下のフォームのように複数の同じ入力値に対してバリデーションをします。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class BlogController extends Controller
{
// テストデータを作成
public function gettest() {
$dataList = Array(
array('id' => 1, 'name' => '山田一郎', 'age' => 20),
array('id' => 2, 'name' => '山田二郎', 'age' => 22),
array('id' => 3, 'name' => '山田三郎', 'age' => 24),
array('id' => 4, 'name' => '山田四郎', 'age' => 26),
array('id' => 5, 'name' => '山田五郎', 'age' => 28),
);
return view('test', [
'dataList' => $dataList
]);
}
// bladeからのpost先
public function posttest(Request $request) {
// バリデーション name属性に「.*」をつける
$validated = $request->validate([
'id.*' => 'required',
'name.*' => 'required',
'age.*' => 'required|regex:/^[0-9]+$/'
]);
return view('test');
}
}
