Laravel 繝舌Μ繝繝シ繧キ繝ァ繝ウ縺ァ縺ョSoftDelete(隲也炊蜑企勁)縺ィUnique蛻カ邏縺ョ譛驕ゥ隗」

Laravel縺ァ縺ョ繝舌Μ繝繝シ繧キ繝ァ繝ウ繝√ぉ繝繧ッ縺ッ縺ィ縺ヲ繧ゆセソ蛻ゥ縺ァ菴ソ縺繧縺吶>縺ァ縺吶′縲ゞnique蛻カ邏縺ョ繝√ぉ繝繧ッ繧定。後≧髫帙↓諠ウ螳壹→逡ー縺ェ繧区嫌蜍輔r縺吶k菴ソ縺譁ケ縺後≠繧翫∪縺吶

SoftDelete(隲也炊蜑企勁)貂医∩縺ョ繝繝シ繧ソ縺袈nique蛻カ邏繝√ぉ繝繧ッ蟇セ雎。縺ィ縺ェ繧峨↑縺シ

縺薙ョ縺溘a縲√ョ繝シ繧ソ繝吶シ繧ケ縺ォUnique繧ュ繝シ繧定ィュ螳壹@縺ヲ縺繧九→隲也炊蜑企勁貂医∩繝繝シ繧ソ縺ィ蜷後§繝繝シ繧ソ繧棚nsert縺励h縺縺ィ縺吶k縺ィ繧ュ繝シ驥崎、縺ァ繧ィ繝ゥ繝シ縺ォ縺ェ繧翫∪縺吶

SQLSTATE[23000]: Integrity constraint violation: 2 Duplicate entry '2' for key 'email_unique'

繧ー繧ー縺」縺ヲ縺ソ縺セ縺励◆縺後ヴ繝ウ縺ィ縺上k隗」豎コ遲悶′隕句ス薙◆繧峨↑縺九▲縺溘ョ縺ァ縲∝ッセ遲悶r閠縺医※縺ソ縺セ縺励◆縲

菴輔′襍キ縺薙▲縺ヲ縺繧九°

莠句燕貅門y

縺セ縺壹ッUser繝「繝繝ォ縺ォ蟇セ縺励※SoftDelete繧定ィュ螳壹@縲‘mail縺ォ縺ッUnique蛻カ邏繧定。後>縺セ縺吶

繝槭う繧ー繝ャ繝シ繧キ繝ァ繝ウ繝輔ぃ繧、繝ォ繧呈栢邊

Schema::table('Users', function (Blueprint $table) {
            $table->id();
            $table->string('email')->unique();
            $table->softDeletes();
});

User.php縺ッ縺薙■繧

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    use SoftDeletes;
    
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

}

縺薙ョUser繝繝シ繝悶Ν繧剃ス懈舌@繝繝シ繧ソ繧呈コ門y縺励∪縺吶

idemaildeleted_at
1syun@test.com
2taro@test.com2023/6/22
3saburo@test.com

3莉カ縺ョ繝繝シ繧ソ縺檎匳骭イ縺輔l縲(d:2縺ョtaro縺輔s縺ッ隲也炊蜑企勁縺輔l縺ヲ縺縺セ縺吶

縺薙ョ迥カ諷九〒Laravel縺九i縲荊aro@test.com縲阪ョ繝。繝シ繝ォ繧「繝峨Ξ繧ケ繧呈、懃エ「縺吶k縺ィ繝偵ャ繝医@縺セ縺帙s縲

隲也炊蜑企勁縺輔l縺ヲ縺繧九◆繧∬ェ蜍輔〒辟。隕悶☆繧九h縺縺ォ縺ェ縺」縺ヲ縺縺セ縺吶ゆセソ蛻ゥ縺ァ縺吶ュ縲

繝舌Μ繝繝シ繧キ繝ァ繝ウ繝ォ繝シ繝ォ菴懈

繝。繝シ繝ォ繧「繝峨Ξ繧ケ縺ョ譁ー隕冗匳骭イ繧譖エ譁ー譎ゅ↓Unique蛻カ邏縺ョ繧ィ繝ゥ繝シ繝。繝繧サ繝シ繧ク縺瑚。ィ遉コ縺ァ縺阪k繧医≧縺ォemail縺ォ蟇セ縺励ヰ繝ェ繝繝シ繧キ繝ァ繝ウ繝ォ繝シ繝ォ繧定ィュ螳壹@縺セ縺吶

public function rules()
{
   return [
      'email' => 'unique:users'
   ];
}

驥崎、繝繝シ繧ソ縺ョ逋サ骭イ

縺薙l縺ァ貅門y縺ッ螳御コ縺ァ縺吶

譁ー縺励¥莨壼藤繧剃ス懈舌☆繧九ユ繧ケ繝医r陦後▲縺ヲ縺縺阪∪縺励g縺

繧ア繝シ繧ケシ代譁ー隕冗匳骭イ

繧ア繝シ繧ケ蜈・蜉帛、譛溷セ蜍穂ス邨先棡
譁ー隕冗匳骭イgoro@test.com逋サ骭イ縺ァ縺阪k縺薙→

縺薙l縺ッ蝠城。後↑縺丞虚菴懊@縺セ縺吶

繧ア繝シ繧ケシ偵驥崎、繧ィ繝ゥ繝シ

繧ア繝シ繧ケ蜈・蜉帛、譛溷セ蜍穂ス邨先棡
譁ー隕冗匳骭イsyun@test.com逋サ骭イ縺ァ縺阪↑縺縺薙→

豁」縺励¥驥崎、繝√ぉ繝繧ッ繧ィ繝ゥ繝シ縺瑚。ィ遉コ縺輔l繧九%縺ィ縺檎「コ隱阪〒縺阪∪縺吶

繧ア繝シ繧ケシ薙隲也炊蜑企勁貂医∩縺ョ莨壼藤縲竊舌蝠城。後ョ繧ア繝シ繧ケ

繧ア繝シ繧ケ蜈・蜉帛、譛溷セ蜍穂ス邨先棡
譁ー隕冗匳骭イtaro@test.com逋サ骭イ縺ァ縺阪↑縺縺薙→

繧ィ繝ゥ繝シ縺ォ縺ェ繧翫∪縺吶

繝繝シ繝悶Ν荳翫↓縺ッ蟄伜惠縺励※縺繧九ョ縺ァ縺吶′縲繝舌Μ繝繝シ繧キ繝ァ繝ウ繝√ぉ繝繧ッ繧偵ヱ繧ケ縺祐QL縺ョUnique蛻カ邏驕募渚縺ァ繧ィ繝ゥ繝シ縺ォ縺ェ繧翫∪縺吶

蜴溷屏

Laravel縺ョ繝「繝繝ォ縺ォSoftDelete險ュ螳壹r陦後≧縺ィ縲‥eleted_at縺ョ繧ォ繝ゥ繝縺ォ繝繝シ繧ソ縺悟・縺」縺ヲ縺繧句エ蜷医ッ縺昴ョ繝繝シ繧ソ繧堤┌縺九▲縺溘%縺ィ縺ョ繧医≧縺ォ辟。隕悶@縺ヲ縺上l縺セ縺吶

繝繝シ繧ソ繧貞盾辣ァ縺吶k髫帙↑縺ゥ縺ォ縺ッ蝠城。後↑縺縺ョ縺ァ縺吶′縲ゞnique蛻カ邏縺ェ縺ゥ陦後▲縺ヲ縺繧九→荳願ィ倥〒縺皮エケ莉九@縺溷撫鬘後′逋コ逕溘@縺セ縺吶

隗」豎コ遲 繧ォ繧ケ繧ソ繝繝ォ繝シ繝ォ縺ョ菴懈

隲也炊蜑企勁繝繝シ繧ソ繧ょ性繧√※閾ェ蛻莉・螟悶ョ繝。繝シ繝ォ繧「繝峨Ξ繧ケ縺碁崎、縺励※縺繧九°縺ゥ縺縺九r讀懆ィシ縺吶k繝舌Μ繝繝シ繧キ繝ァ繝ウ縺ョ繧ォ繧ケ繧ソ繝繝ォ繝シ繝ォ繧剃ス懈舌@縺セ縺励◆縲

ValidationRule縺ォ繧医k繧ォ繧ケ繧ソ繝繝ォ繝シ繝ォ

<?php

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class EmailUnique implements ValidationRule
{
    protected int $user_id;

    public function __construct(int $user_id)
    {
        $this->user_id = $user_id;
    }

    public function validate(string $attribute, mixed $value, Closure $fail): void
    {

        $object = User::where('email' , '=' ,  $value)->whereNot('user_id' , $this->user_id ?? null)->first();

        if(empty($object) === false){
            $fail(__('繝。繝シ繝ォ繧「繝峨Ξ繧ケ縺ッ縺吶〒縺ォ逋サ骭イ縺輔l縺ヲ縺縺セ縺吶'));
        }

    }

Laravel 9莉・髯阪ッ縲軍ule縲阪ョ邯呎価縺碁撼謗ィ螂ィ縺ォ縺ェ縺」縺ヲ縺縺セ縺吶
縲祁alidationRule縲阪r蛻ゥ逕ィ縺励∪縺励g縺縲

繧ォ繧ケ繧ソ繝繝ォ繝シ繝ォ縺ョ蛻ゥ逕ィ譁ケ豕

繧ォ繧ケ繧ソ繝繝ォ繝シ繝ォ縺ョ蛻ゥ逕ィ譁ケ豕輔ッ縺薙■繧峨Gorm request縺ェ縺ゥ縺ァ繝舌Μ繝繝シ繧キ繝ァ繝ウ縺励∪縺吶

閾ェ霄ォ縺ョ繝。繝シ繝ォ繧「繝峨Ξ繧ケ繧帝勁螟悶☆繧九◆繧√↓縲√Θ繝シ繧カ縺ョID繧呈ク。縺励※縺縺セ縺吶

    public function rules(): array
    {
        return [
            'email' => new EmailUnique(Auth::id())
        ];
    }

縺薙l縺ァ隲也炊蜑企勁貂医∩縺ョ繝繝シ繧ソ繧ょ性繧√◆Unique蛻カ邏縺檎「コ菫昴〒縺阪∪縺励◆縲

縺セ縺ィ繧

隲也炊蜑企勁縺ァ繝繝シ繧ソ繧呈ョ九@縺溘∪縺セUnique蛻カ邏繧偵°縺代k縺ィ縺縺隕∽サカ縺後Ξ繧「繧ア繝シ繧ケ縺九b縺励l縺セ縺帙s縺後∝ョ溽樟譁ケ豕輔ョ荳萓九→縺励※鬆ュ縺ョ迚髫縺ォ蜈・繧後※縺翫¥縺ィ縲√>縺、縺句スケ縺ォ遶九▽縺九b縺励l縺セ縺帙s縲

繧ウ繝。繝ウ繝医r谿九☆