category

category

laravel

2025.8.3

2025.9.7

51

【Laravel】フォームリクエストを使用したカスタムバリデーションの重複不可(ユニーク)チェック

新規作成時、更新時に任意のカラムの重複チェックを行う。

更新時、自分自身との重複エラーがでないよう対応済。

前提条件

テーブルのプライマリキーの名前は「id」。

ルーティング

Route::get('example/add', 'App\Http\Controllers\ExampleController@add')->name('example.add');
Route::post('example/add', 'App\Http\Controllers\ExampleController@create');
Route::get('example/edit', 'App\Http\Controllers\ExampleController@edit')->name('example.edit');
Route::post('example/edit', 'App\Http\Controllers\ExampleController@update');

※新規作成時のアドレスが「example/add」、修正時が「example/edit」。

フォームリクエスト

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;

class ExampleRequest extends FormRequest
{
    public function authorize(): bool
    {
        if($this->path() == 'example/add' || $this->path() == 'example/edit'){
            return true;
        }else{
            return false;
        }
    }

    public function rules(): array
    {
        return [
            'password' => 'required',
            'name' => 'required|unique:examples,name,' . $this->id . ',id',
             
        ];
    }
    public function messages(): array
    {
        return [
            'password.required' => 'パスワードは必須です',
            'name.required' => '名前は必須です',
            'name.unique' => '既に登録済みの名前です',
        ];
    }
}

※2つのカラムのチェックをしている。カラム「password」は必須入力、「name」は必須入力と重複チェック。

※authorizeメソッドに、フォームリクエストを使用するアドレスでのアクセスはtrueを返すよう記述。

コントローラ【新規作成時】

public function add(Request $request){
    return view('example.add');
}

public function create(ExampleRequest $request){
    $input = $request->all();
    Example::create($input);
    return redirect()->route('example.index');
}

※POST時(createメソッド)のリクエストにオリジナルの「ExampleRequest」を使用している。

コントローラ【更新時】

public function edit(Request $request){
    $example = Example::find($request->id);
    return view('example.edit',['form' => $example]);
}

public function update(ExampleRequest $request){
    $example= Example::find($request->id);
    $example->update($request->all());
    return redirect()->route('example.index');
}

※POST時(updateメソッド)のリクエストにオリジナルの「ExampleRequest」を使用している。

ビューテンプレート(新規作成時)example.add

@section('content')
    @if(count($errors) > 0)
        <ul class="error">
        @foreach ($errors->all() as $error)
            <li>{{$error}}</li>
        @endforeach
        </ul>
    @endif
    
    <form action="{{url('')}}/example/add" method="post">
        @csrf
        <ul>
            <li>ドメイン名:<input type="text" name="name" value="{{old('name')}}" /></li>
            <li>パスワード:<input type="text" name="password" value="{{old('password')}}" /></li>
        </ul>
        <input type="submit" value="登録">
    </form>
@endsection

ビューテンプレート(更新時)example.edit

@section('content')
    @if(count($errors) > 0)
        <ul class="error">
        @foreach ($errors->all() as $error)
            <li>{{$error}}</li>
        @endforeach
        </ul>
    @endif
    
    <form action="{{url('')}}/example/edit" method="post">
        @csrf
        <input type="hidden" name="id" value="{{$form->id}}">
        <ul>
            <li>名前:<input type="text" name="name" value="{{$form->name}}" /></li>
            <li>パスワード:<input type="text" name="password" value="{{$form->password}}" /></li>
            
        </ul>
        <input type="submit" value="修正する">
    </form>
@endsection

1074

コメント

コメントを残す

ニックネームは公開されます

CAPTCHA


閉じる