以前の投稿「FormRequestで入力値を補正」でチェックボックスがオフのときの値の補正に関して説明しました。今度はFormRequestを使わないときの補正の仕方です。

このような入力画面があるとします。

それを受けるコントローラのメソッドを以下とすると、

...
    public function update(Request $request, Customer $customer)
    {
      $validated = $request->validate([
              'active_flag' => ['nullable'],
              'email'       => ['required', 'email', 'unique:customer,email'],
              'name'        => ['required'],
              'name_kana'   => ['required'],
    ]);

        dd($validated);
    }
...

このような配列が返ってきます。

[
    'active_flag' => 'Y',
    'email' => 'test@example.com',
    'name'  => 'テスト太郎',
    'name_kana' => 'てすとたろう',
]

しかし、先のチェックボックス「有効」がオフだとすると、

[
    'email' => 'test@example.com',
    'name'  => 'テスト太郎',
    'name_kana' => 'てすとたろう',
]

と、active_flagの項目はリクエストには存在しません。チェックボックスがオフだとブラウザはサーバーに何も返さないからです。

しかし、それをコントローラで判断してDBに無効(この場合N)を保存したいです。

そのような場合は、RequestのメソッドのmergeIfMissing()を使います。オフのときの値を引数として与えます。複数の項目の指定も可能です。

...
    public function update(Request $request, Customer $customer)
    {
        $request->mergeIfMissing(['active_flag' => 'N']); // デフォルトの値を設定!

        $validated = $request->validate([
              'active_flag' => ['required', 'In:Y,N'], // 必須と値を確認!
              'email'       => ['required', 'email', 'unique:customer,email'],
              'name'        => ['required'],
              'name_kana'   => ['required'],
    ]);

        dd($validated);
    }
...

値は補正されて、期待通りにNが入ってきます。上のバリデーションルールで見られるように、値が必須であること、値がYあるいはNであることもチェックできます。

[
    'active_flag' => 'N',
    'email' => 'test@example.com',
    'name'  => 'テスト太郎',
    'name_kana' => 'てすとたろう',
]

By khino