質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

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

PHP

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

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Q&A

解決済

3回答

4055閲覧

Laravelでユーザー登録時にランダムなユーザーIDを発行したい

suika11

総合スコア166

Laravel

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

PHP

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

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

0グッド

0クリップ

投稿2022/02/16 02:51

編集2022/02/16 03:04

前提・実現したいこと

ユーザーがアカウント登録した時に他のレコードと重複しない固有のStr.random()で文字列を生成し、createメソッドが登録ができなかったら再度文字列を生成しcreate()を試みる、それも登録ができなければ同じことを登録できるまで繰り返す、という処理を作りたいです。認証機能はLaravel Breezeを使っています。
usersテーブルのuniqueキーが設定されたuseridカラムがランダム文字列の登録用カラムです。RegisteredUserController.phpのcreate()に'userid' => Str::random(15)を指定することでランダム文字列を登録することができるところまではわかったのですが、createメソッドで登録ができなかった場合、できるまでcreateメソッドを繰り返す処理の作り方がわかりません。while文を使うのではないかと思ったのですが、それ以上は思い浮かびませんでした。

該当のソースコード

RegisteredUserController.php

1<?php 2 3namespace App\Http\Controllers\Auth; 4 5use App\Http\Controllers\Controller; 6use App\Models\User; 7use App\Providers\RouteServiceProvider; 8use Illuminate\Auth\Events\Registered; 9use Illuminate\Http\Request; 10use Illuminate\Support\Str; 11use Illuminate\Support\Facades\Auth; 12use Illuminate\Support\Facades\Hash; 13use Illuminate\Validation\Rules; 14 15class RegisteredUserController extends Controller 16{ 17 /** 18 * Display the registration view. 19 * 20 * @return \Illuminate\View\View 21 */ 22 public function create() 23 { 24 return view('auth.register'); 25 } 26 27 /** 28 * Handle an incoming registration request. 29 * 30 * @param \Illuminate\Http\Request $request 31 * @return \Illuminate\Http\RedirectResponse 32 * 33 * @throws \Illuminate\Validation\ValidationException 34 */ 35 public function store(Request $request) 36 { 37 $request->validate([ 38 'name' => ['required', 'string', 'max:255'], 39 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 40 'password' => ['required', 'confirmed', Rules\Password::defaults()], 41 ]); 42 43 $user = User::create([ 44 'name' => $request->name, 45 'email' => $request->email, 46 'password' => Hash::make($request->password), 47 'icon' => '', 48 'userid' => Str::random(15), 49 ]); 50 51 event(new Registered($user)); 52 53 Auth::login($user); 54 55 return redirect(RouteServiceProvider::HOME); 56 } 57}

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

Laravel 8.79.0
PHP 8.1.1

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

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

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

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

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

guest

回答3

0

ベストアンサー

UUID使っておけば理論上は重複しない。

php

1'userid' => Str::uuid(),

どうしても15文字で作りたいなら存在しないuseridができるまで繰り返すしかない。

php

1do { 2 $userid = Str::random(15); 3} while (User::where('userid', $userid)->exists()); 4 5'userid' => $userid,

投稿2022/02/16 03:21

kawax

総合スコア10377

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

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

suika11

2022/02/17 11:25

ありがとうございます。なるべく少ない文字のIDはユーザーのためにとっといておきたいのでマックスの15文字としました。また、Str::random()を採用した理由はユーザーIDに使用できる文字は半角英数字のみで記号は使えないようにしたいためでした(質問内容に含めるべきでした)
guest

0

createメソッドを試みる、それも失敗したら同じことを成功するまで繰り返す

であれば、成功するまでwhileループを回し続ければ、一応実現できます。
この場合一番気を付けなければならないのは、
・全然成功せずループが回り続ける
という状況が発生したらどうするか、です。
いつまでたっても反応がないだけでなく、下手するとサーバーに過負荷を与えてシステム全体に障害発生…

そういう意味では試行回数の上限を切っておいて、そこに達してなお失敗したら「時間をおいて再登録してください」みたなエラーダイアログを出して終了させるのがユーザーにとってもサーバーにとっても親切かな、と思います。

投稿2022/02/16 03:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

suika11

2022/02/17 11:29

ありがとうございます。回数制限の設定は勉強になりました。また何かありましたらよろしくお願いします。
guest

0

それが失敗した場合どうしたらいいかわかりません。

それは作る人が決めることです。
失敗としてユーザーに通知するか、
生成できるまで繰り返すのか etc..

「何を以て失敗とするか」「何を以て成功とするか」を決めてください。
そこから「どうするか」を決めてください。

投稿2022/02/16 02:56

m.ts10806

総合スコア80850

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

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

suika11

2022/02/16 02:59

失敗というのはcreateメソッドでデータが登録できない時で、成功は登録できた時でした。質問文を修正します
m.ts10806

2022/02/16 03:02

結局は回答に書いたように「作る人が決めること」です。 設計なしに実装は入れるものではないです。特に異常系は。
suika11

2022/02/16 03:05

ありがとうございます。もう少し自分で頑張ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問