Laravel: 更新時のユニーク検証 質問する

Laravel: 更新時のユニーク検証 質問する

この質問はこれまで何度も聞かれてきたことは承知していますが、モデル内で検証するときに ID を取得する方法について説明している人はいません。

'email' => 'unique:users,email_address,10'

検証ルールはモデル内にあるので、レコードの ID を検証ルールに渡すにはどうすればよいでしょうか。

私のモデル/ユーザーはこちら

protected $rules_update = [
    'email_address' => 'required|email|unique:users,email_address,'.$id,
    'first_name' => "required",
    'last_name' => "required",
    'password' => "required|min:6|same:password_confirm",
    'password_confirm' => "required:min:6|same:password",
    'password_current' => "required:min:6"
];

モデル/ベースモデル

    protected $rules = array();

public $errors;

/*
    * @data: array, Data to be validated
    * @rules: string, rule name in model 
*/

public function validate($data, $rules = "rules") {

    $validation  = Validator::make($data, $this->$rules);

    if($validation->passes()) {
        return true;
    }

    $this->errors = $validation->messages();

    return false;
}

ベストアンサー1

補足ですが、この質問に対するほとんどの回答では、email_addressLaravel の組み込み認証システムでは、メール フィールド名は であると述べていますemail。更新時に一意のフィールド、つまりメールを検証する方法の例を次に示します。

フォームリクエスト、あなたはこれを好きです:

public function rules()
{
  return [
      'email' => 'required|email|unique:users,email,'.$this->user->id,
  ];
}

または、コントローラーでデータを直接検証する場合:

public function update(Request $request, User $user)
{
  $request->validate([
      'email' => 'required|email|unique:users,email,'.$user->id,
  ]);
}

アップデートUser: サインインしたユーザーを更新していて、ルートにモデルを挿入していない場合は、idにアクセスするときに undefined プロパティが発生する可能性があります$this->user。その場合は、以下を使用します。

public function rules()
    {
      return [
          'email' => 'required|email|unique:users,email,'.$this->user()->id,
      ];
    }

Laravel 5.7 以降のよりエレガントな方法は次のとおりです。

public function rules()
{
    return [
        'email' => ['required', 'email', \Illuminate\Validation\Rule::unique('users')->ignore($this->user()->id)]
    ];
}

PS: この例を初心者にわかりやすくするために、必須やメールなどの他のルールもいくつか追加しました。

おすすめ記事