この質問はこれまで何度も聞かれてきたことは承知していますが、モデル内で検証するときに 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_address
Laravel の組み込み認証システムでは、メール フィールド名は であると述べています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: この例を初心者にわかりやすくするために、必須やメールなどの他のルールもいくつか追加しました。