🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Q&A

解決済

2回答

3217閲覧

ユーザー情報編集機能を実装したい メールアドレス重複時にはバリテーション等でエラーメッセージを出したい

bokupiroki

総合スコア54

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

0グッド

0クリップ

投稿2021/03/16 00:22

編集2024/03/06 12:59

前提・実現したいこと

  • laravel6.0
  • php artisan ui vue --authコマンドでユーザー認証機能を実装済
  • ログイン中のユーザーが自分のユーザー名やメールアドレスを編集(更新)できるようにしている

変更後のメールアドレスが、もしほかのユーザーにより既にテーブル(usersテーブル)に登録されている値なら
バリテーション等で「このメールアドレスは既に登録されています」
のようなメッセージを出せるようにしたいです。

例えばtwitterなどで、自分のメールアドレスを
「ほかのユーザーが使っているメールアドレス」に変更しようとしたら
それを知らせるメッセージが出ると思います。

発生している問題・エラーメッセージ

ユーザー情報編集画面で、ログインユーザーのメールアドレスを
「すでにほかのユーザーが登録しているメールアドレス」
に変更しようとすると、laravelのエラーが表示されます。

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'jono@gmail.com' for key 'users.users_email_unique' (SQL: update `users` set `email` = jono@gmail.com, `users`.`updated_at` = 2021-03-16 08:48:00 where `id` = 1)

該当のソースコード

↓ユーザー情報編集ぺージのビュー(mypage.blade.php)

php

1 {{$aftername ?? Auth::user()->name}}さんのアカウント情報</h1> 2 <form id="search_form" action="{{url('/mypage')}} " method="post"> 3 @csrf 4 <table class="table"> 5 <tbody> 6 <tr> 7 <th scope="row" style="width:%">ユーザーID</th> 8 <td style="width:%">{{ Auth::user()->id }}</td> 9 <td></td> 10 </tr> 11 <tr> 12 <th scope="row">ユーザー名</th> 13 <td> <input type="text" id="name" name="name" value="{{$aftername ?? Auth::user()->name}}" 14 required="required" autocomplete="name" autofocus="autofocus" class="form-control"></td> 15 <td></td> 16 </tr> 17 <tr> 18 <th scope="row">メールアドレス</th> 19 <td> 20 <input id="email" type="email" name="email" value="{{$afteremail ?? Auth::user()->email }}" required="required" autocomplete="email" autofocus="autofocus" class="form-control "> 21 </td> 22 <td></td> 23 </tr> 24 <tr> 25 <th scope="row">アカウント登録日</th> 26 <td>{{Auth::user()->created_at->format('Y年m月d日') }}</td> 27 <td> 28 </td> 29 </tr> 30 <th scope="row"></th> 31 <td></td> 32 <td><button class="btn btn-outline-secondary" type="submit" id="">送信</button></td> 33 </tr> 34 </tbody> 35 </table> 36 </form>

↓コントローラー(UserController.php)

php

1 public function myPageUpdate(Request $request,User $user) 2 { 3 $user =Auth::user(); 4 $aftername = $request->input('name'); 5 $afteremail = $request->input('email'); 6 7 $user_record = User::where('id', $user->id); 8 9 $user_record->update(['name' => $request->name]); 10 $user_record->update(['email' => $request->email]); 11 return view('mypage')->with('aftername', $aftername)->with('afteremail', $afteremail); 12 }

試したこと

例えばlocalhost/registerでは、既に登録されているメールアドレスを入力するとバリテーションでメッセージを出してくれます。

そのため、この部分をつかさどるであろうビューファイル「register.blade.php」の

php

1<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email"> 2 3@error('email') 4 <span class="invalid-feedback" role="alert"> 5 <strong>{{ $message }}</strong> 6 </span> 7@enderror

をユーザー情報編集ブレード(mypage.blade.php)のメールアドレスの部分に移植してみましたが、結果は同じでした。

よい方法があれば知恵を貸していただきたいです。

補足情報(FW/ツールのバージョンなど)

laravel6.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

この部分をつかさどるであろうビューファイル

この発想が全く違う。
見る順番はルーティング→コントローラー→ビュー。
LaravelはMVCを強調してないけど一切知らなくていいわけでもなくMVCは知ってて当然の常識なだけ。

Laravel6の登録時のコントローラーはこれ。
https://github.com/laravel/laravel/blob/6.x/app/Http/Controllers/Auth/RegisterController.php

'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],

uniqueでバリデーションしているから重複を許可しない。

更新時はこれでは足りない。すでに登録済の自分のメールアドレスが存在するから。
なのでuniqueには「このIDは除外」する機能がある。

use Illuminate\Validation\Rule; 'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],

Laravel8とfortifyでもignore()。
https://github.com/laravel/fortify/blob/1.x/stubs/UpdateUserProfileInformation.php

公式のドキュメントとGitHubに全部の答えはある。

投稿2021/03/16 01:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bokupiroki

2021/03/27 06:51

コントローラーに $request->validate([ 'email' => ['required','string','email','max:255',Rule::unique('users')->ignore($user->id)], ]); と記載したところ、他人のメールアドレスと重複時だけエラーメッセージを出せるようになりました。 ありがとうございました。
guest

0

バリデーション 6.x Laravel
フォームリクエストバリデーション、の出番ではないかと。
(私もいまココ学習中。)

投稿2021/03/16 00:25

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問