Larave7 バリデーションuniqueでupdate時の対処法

2重登録をさせたくない時はバリデーションの’unique’を使えば良いけど、このuniqueってupdateの時にも該当する。つまり、更新しようとしているのに”2重登録ですよ”って言われてしまうのでその対処方法。

uniqueの第3パラメータと第4パラメータで、この値(第3パラメータ)とこのカラム(第4パラメータ)が一致するレコードには、このルールは適用させないということが出来るので、これを利用する。

例)同一メールアドレスの重複登録をさせない場合

'email' => ['required', 'email', 'unique:admins'],

こうすることで、postされたemail変数の値は必須であり、メールアドレス形式であり、adminsテーブルのemailカラムに存在しないことというルールが定義でき、新規登録の場合は問題ないが、更新時もこのルールが適用されてしまい更新することが出来ない。

なので、以下の様に変更

'email' => ['required', 'email', 'unique:admins,email,'.$this->id.',id']

こうすることで、第3パラメータのidとadminsテーブルのidカラムが一致するレコードはルール対象外とする。
つまり、新規登録時は第3パラメータがnullになるようにしてルール対象外はなしとし、更新時は更新対象レコードのidが第3パラメータになるようにして更新可能にする。

全体ソース

AdminRequest.php
<?php

namespace App\Http\Requests\Admin;

class AdminRequest extends Request
{
    private $id;

    public function authorize()
    {
        return true;
    }

    public function all($keys = null)
    {
        $results = parent::all($keys);
        $this->id = $results['id'];

        return $results;
    }

    public function rules()
    {
        return [
            'email' => ['required', 'email', 'unique:admins,email,'.$this->id.',id'],
        ];
    }

}

第3パラメータに更新対象のidを指定しないといけないため、編集ページのview(xxx.blade.php)からコントローラにidをpostするようにしておく。

postされた値は、$results = parent::all($keys);後、$resultsに入っているので$this->id = $results[‘id’];をしてプライベート変数に格納しておく。

そのプライベート変数に格納したidをuniqueの第3パラメータにセットすることによりそのレコードを重複チェック対象外にする。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です