前回において、理想のバリデーションの関数、rules()を作成できたところで、今回は、そのバリデーションチェックを通過した入力データをDBに保存するところを見てみます。

なんのことはなく、$request->validate()がそのデータを返してくれるので、以下のように、返ってきた連想配列値をそのまま、create()あるいはupdate()に引数として渡せばいいのです。簡単ですね!

namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
 
use App\User;
 
class UserController extends Controller
{
    public function rule(User $user = null)
   {
        // 共有するルール kana, mailcode, phone_with_dashはカスタムバリデーター
        $rules = [
            'name'        => 'required',
            'name_kana'   => 'required|kana',
            'mailcode'    => 'required|mailcode',
            'prefecture'  => 'required',
            'city'        => 'required',
            'address1'    => 'required',
            'phone'       => 'required|phone_with_dash',
            'password'    => 'sometimes|required|min:8|max:20|confirmed',
            'email'       => [
                    'required',
                    'email',
                    Rule::unique('users')->ignore(optional($user)->id), //重複がないかチェック
                ]
        ];
 
        return [
            // rules
            $rules,
            // messages
            [
                'password.min' => '8から20文字長でお願いします',
                'password.max' => '8から20文字長でお願いします'
            ]
            // attributes
        ];
    }
...
    public function store(Request $request)
    {
        $validated = $request->validate(...$this->rules());
        User::create($validated);
    }
...
    public function update(Request $request, User $user)
    {
        $validated = $request->validate(...$this->rules($user));
        $user->update($validated);
    }
...
}

しかし、ここで1つ問題です。画面には入力項目、住所2として、address2があります。項目は必須ではないので、上の例ではこれが保存されません。

これを解決するには、以下のようにルールにsometimesを使用して項目を作成すればいいですね。

...
    public function rule(User $user = null)
   {
        // 共有するルール kana, mailcode, phone_with_dashはカスタムバリデーター
        $rules = [
            'name'        => 'required',
            'name_kana'   => 'required|kana',
            'mailcode'    => 'required|mailcode',
            'prefecture'  => 'required',
            'city'        => 'required',
            'address1'    => 'required',
            'address2'    => 'sometimes|required',
            'phone'       => 'required|phone_with_dash',
            'password'    => 'sometimes|required|min:8|max:20|confirmed',
            'email'       => [
                    'required',
                    'email',
                    Rule::unique('users')->ignore(optional($user)->id), //重複がないかチェック
                ]
        ];
 
        return [
            // rules
            $rules,
            // messages
            [
                'password.min' => '8から20文字長でお願いします',
                'password.max' => '8から20文字長でお願いします'
            ]
            // attributes
        ];
    }
...

By khino