Laravel

【Laravel】登録・更新時のDBデータ重複チェック方法(Validator+unique、DB::table+whereRaw)

Laravelで登録・更新時に同じメールアドレスまたはメールアドレスと名前の組み合わせが同じ場合、登録されない様に重複チェックしたい場合があります。
そんな時に「Validator+unique」または「DB::table+whereRaw」を使って登録・更新時のDBデータ重複チェック方法をご紹介します。

用意したusersテーブル構造

以下のusersテーブルを用意しました。

usersテーブル

名前 説明
id 主キー
name ユーザー名
email メールアドレス

Validatorとuniqueを使ってメールアドレスの重複チェック

Validatorとuniqueを使った登録処理重複チェックのControllerの記述

※UsersController内の登録処理entry()内のバリデーションチェック時にメールアドレスに対して重複チェックを行います。
 「’email’ => ‘required|unique:users,email」の記述より、「unique:users,email」にてusersテーブルのemailカラムに重複したメールアドレスが登録されて無いかチェックします。

    public function entry(Request $request) {
        //バリデーション
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|unique:users,email'
        ]);

        //バリデーションエラー時のリダイレクト先(登録画面)
        if ($validator->fails()) {
                return redirect('/usersregister')
                    ->withInput()
                    ->withErrors($validator);
        }
  
        //登録処理
        $users = new User;
        $users->name = $request->name;
        $users->email = $request->email;
        $users->save();
        return redirect('/userslist')->with('message', '登録が完了しました');
    }

Validatorとuniqueを使った更新処理重複チェックのControllerの記述

※UsersController内の更新処理update()内のバリデーションチェック時にメールアドレスに対して重複チェックを行います。
 「’email’ => ‘required|unique:users,email,’.$request->id.’,id’」の記述より、「unique:users,email,’.$request->id.’,id’」にて「更新データのidがusersテーブルのidカラム以外」で、usersテーブルのemailカラムに重複したメールアドレスが登録されて無いかチェックします。

    public function update(Request $request) {
        //バリデーション
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|unique:users,email,'.$request->id.',id'	//更新データのidがusersテーブルのidカラム以外
        ]);

        //バリデーションエラー時のリダイレクト先(更新画面)
        if ($validator->fails()) {
            return redirect('/usersedit/'.$request->id)
                 ->withInput()
                ->withErrors($validator);
        }
  
        //更新処理
        $users = User::find($request->id);
        $users->name = $request->name;
        $users->email = $request->email;
        $users->save();
        return redirect('/userslist')->with('message', '更新が完了しました');
    }

DB::tableとwhereRawを使ってメールアドレスと名前の組み合わせが同じ場合の重複チェック

DB::tableとwhereRawを使った登録処理重複チェックのControllerの記述

※UsersController内の登録処理entry()内の重複データチェック時にメールアドレスと名前の組み合わせが同じ場合の重複チェックを行います。
 「//重複データチェック」の記述より、$sqlで「name」カラムと「email」カラムが一致する場合のSQL条件文を作成します。
 「DB::table(テーブル名)->whereRaw(SQL条件文)->get()」で一致するデータを取得し、データががある場合はリダイレクト先(登録画面)にエラーメッセージを表示します。

    public function entry(Request $request) {
        //バリデーション
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required'
        ]);

        //バリデーションエラー時のリダイレクト先(登録画面)
        if ($validator->fails()) {
                return redirect('/usersregister')
                    ->withInput()
                    ->withErrors($validator);
        //重複データチェック
        }else{
            $chk=[];
            $sql = '1=1';
            $sql .= " AND name = '".$request->name."'";
            $sql .= " AND email = '".$request->email."'";
            $chk = DB::table('users')
            ->whereRaw($sql)
            ->get();

            if(count($chk) > 0){
                return redirect('/usersregister')
                    ->withInput()
                    ->withErrors("メールアドレス+名前が登録済みです。");
            }
        }
  
        //登録処理
        $users = new User;
        $users->name = $request->name;
        $users->email = $request->email;
        $users->save();
        return redirect('/userslist')->with('message', '登録が完了しました');
    }

DB::tableとwhereRawを使った更新処理重複チェックのControllerの記述

※UsersController内の更新処理update()内の重複データチェック時にメールアドレスと名前の組み合わせが同じ場合の重複チェックを行います。
 「//重複データチェック」の記述より、$sqlで「name」カラムと「email」カラムが一致する場合のSQL条件文を作成します。
 「$sql .= ” AND id != “.$request->id」をSQL条件文に追加することで「更新データのidがusersテーブルのidカラム以外」のデータとします。
 「DB::table(テーブル名)->whereRaw(SQL条件文)->get()」で一致するデータを取得し、データががある場合はリダイレクト先(登録画面)にエラーメッセージを表示します。

    public function update(Request $request) {
        //バリデーション
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required'
        ]);

        //バリデーションエラー時のリダイレクト先(更新画面)
        if ($validator->fails()) {
            return redirect('/usersedit/'.$request->id)
                 ->withInput()
                ->withErrors($validator);
        //重複データチェック
        }else{
            $chk=[];
            $sql = '1=1';
            $sql .= " AND name = '".$request->name."'";
            $sql .= " AND email = '".$request->email."'";
            $sql .= " AND id != ".$request->id;	//更新データのidがusersテーブルのidカラム以外
            $chk = DB::table('users')
            ->whereRaw($sql)
            ->get();

            if(count($chk) > 0){
                return redirect('/usersedit/'.$request->id)
                    ->withInput()
                    ->withErrors("メールアドレス+名前が登録済みです。");
            }
        }
  
        //更新処理
        $users = User::find($request->id);
        $users->name = $request->name;
        $users->email = $request->email;
        $users->save();
        return redirect('/userslist')->with('message', '更新が完了しました');
    }

Routeの記述

※ページURLは必要に応じて変更して下さい。

//登録画面
Route::get('/usersregister','UsersController@register');
//登録処理
Route::post('/usersentry','UsersController@entry');
//更新画面
Route::get('/usersedit/{users}','UsersController@edit');
Route::post('/usersedit/{users}','UsersController@edit');
//更新処理
Route::post('/users/update','UsersController@update');

 
※流用される場合は自己責任でお願いします。