前回において、理想のバリデーションの関数、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 ]; } ...メルマガ購読の申し込みはこちらから。