這適用于創建/存盤,但不適用于編輯/更新。我希望更新用戶并且資料庫中已經存在資料,出現驗證錯誤。像這樣在用戶存盤中,我添加了資料,并且它起作用了,即使已經有相同的資料然后出現驗證錯誤,但是如果我只更新地址,那么在不同的更新中,仍然使用舊的用戶名資料并且如果我更改用戶名,它也可以作業,但如果我用現有用戶名替換用戶名,則不會出現驗證錯誤,而是顯示以下錯誤。請幫幫我,我還是個學生!
錯誤:
SQLSTATE [23000]:完整性約束違規:1062 鍵 'user_username_unique' 的重復條目 'asdf'(SQL:更新
user集username= asdf,password= $2y$10$BYdDToN5jCCuRLdZx70YA.BFgyVIWulL8n/bv5C3VxOVCw6WBN.kO,kota_id= 1505,kecamatan_id= 15013004,desa_id= 15000user.updated_at= 2022-04-09 14:25:03 其中id= 4)
用戶遷移:
Schema::create('user', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('nik')->unique()->nullable();
$table->string('nama')->nullable();
$table->string('telp')->unique()->nullable();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('foto')->nullable();
$table->string('username')->unique();
$table->string('password');
$table->enum('level', ['user','admin'])->default('user');
$table->unsignedBigInteger('provinsi_id')->nullable();
$table->unsignedBigInteger('kota_id')->nullable();
$table->unsignedBigInteger('kecamatan_id')->nullable();
$table->unsignedBigInteger('desa_id')->nullable();
$table->text('alamat')->nullable();
$table->rememberToken();
$table->timestamps();
});
用戶控制器存盤
public function store(Request $request)
{
$validasi = $request->validate([
'username' => ['required', 'string', 'min:3', 'max:30', 'unique:user'],
'email' => ['required', 'email', 'string', 'max:255', 'unique:user'],
'password' => ['required', 'string', 'min:8'],
'nama' => ['required', 'string', 'min:3', 'max:50'],
'nik' => ['required', 'string', 'min:16', 'max:16', 'unique:user'],
'telp' => ['required', 'string', 'min:12', 'max:13', 'unique:user'],
'provinsi_id' => ['required'],
'kota_id' => ['required'],
'kecamatan_id' => ['required'],
'desa_id' => ['required'],
'foto' => ['mimes:jpeg,jpg,png'],
'level' => ['required'],
'alamat' => ['required'],
]);
$validasi['password'] = Hash::make('password');
$create = User::create($validasi);
if($request->hasFile('foto')){
$request->file('foto')->move('images/',$request->file('foto')->getClientOriginalName());
$create->foto = $request->file('foto')->getClientOriginalName();
$create->save();
}
return redirect()->route('user.index');
}
用戶控制器更新
public function update(Request $request, $id)
{
$user = User::find($id);
$validasi = $request->validate([
'username' => ['required', 'string', 'min:3', 'max:30', 'unique:user,id'],
'email' => ['required', 'email', 'string', 'max:255', 'unique:user,id'],
'password' => ['required', 'string', 'min:8', 'max:20'],
'nama' => ['required', 'string', 'min:3', 'max:50'],
'nik' => ['required', 'string', 'min:16', 'max:16', 'unique:user,id'],
'telp' => ['required', 'string', 'min:12', 'max:13', 'unique:user,id'],
'provinsi_id' => ['required'],
'kota_id' => ['required'],
'kecamatan_id' => ['required'],
'desa_id' => ['required'],
'foto' => ['mimes:jpeg,jpg,png'],
'level' => ['required'],
'alamat' => ['required'],
]);
$validasi['password'] = Hash::make('password');
$user->update($validasi);
if($request->hasFile('foto')){
$request->file('foto')->move('images/',$request->file('foto')->getClientOriginalName());
$user->foto = $request->file('foto')->getClientOriginalName();
$user->save();
}
return redirect()->route('user.index');
}
uj5u.com熱心網友回復:
我認為您正在尋找的是制定一個規則,以“排除”當前用戶對其已經擁有的屬性的唯一性進行檢查:https ://laravel.com/docs/5.8/validation#rule -獨特
uj5u.com熱心網友回復:
原因
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'asdf' for key 'user_username_unique' (SQL: update `user` set `username` = asdf, `password` = ...)
SQL 資料庫引發的上述錯誤表明您正在嘗試更新一條記錄,但該記錄username已存在并被另一條記錄使用。
這就是為什么我要求澄清,“你對 sqlunique約束了解多少?”
通過使用 Laravel Validation using rule 驗證用戶輸入,您可以在一定程度上避免出現錯誤unique:
$request->validate(['username' => [..., 'unique:user'], ...]);
您已經擁有一個完美的store功能示例。上面的宣告告訴 Laravel 檢查我們是否存在username于user表中。
但是,您的update函式不會username像您宣告的那樣驗證欄位:
$request->validate(['username' => [..., 'unique:user,id'],...]);
上面的宣告意味著“檢查列上的表是否username已經存在”。useridLaravel 然后檢查username列id。因此,Laravel 認為username桌面上不存在。幸運的是,您已在遷移中宣告以確保username其唯一性——這就是您遇到該特定錯誤的原因。
解決方案
您可以username從編輯程序中排除或更新您的驗證以排除使用username的觸發驗證錯誤。
$validasi = $request->validate([
'username' => ['required', 'string', 'min:3', 'max:30',
Rule::unique('user')->ignore($user->id)], ...]);
Rule::unique('user')->ignore($user->id)意味著 Laravel 必須確保username除了給定的主鍵之外沒有其他記錄使用$user->id。
替換'unique:user,id'為Rule::unique('user')->ignore($user->id)將確保username除了當前記錄之外的所有其他記錄都是唯一的。這就是 Andreas Bilz 的Laravel 檔案鏈接的意思。
筆記:
- 省略號 (
...) 用于縮短陳述句 - 如果您的應用程式被多個用戶使用,您應該密切注意 SQL 錯誤,并在原子性成為強制性時考慮事務(請參閱:事務)
- 善待試圖幫助的人
uj5u.com熱心網友回復:
您可以使用此代碼,它不會檢查與您傳遞的那個id對應的記錄。假設您正在更新一個id = 1、username = 'test' 和 email = [email protected]的用戶,您想更新用戶名名稱,那么它不會給出電子郵件錯誤,因為它會檢查除 id = 之外的所有其他記錄1
$user = User::find($id);
$validasi = $request->validate([
'username' => 'required|string|min:3|max:30|unique:user,username,'.$id,
'email' => 'required|email|string|max:255|unique:user,email,'.$id,
'password' => 'required|string|min:8|max:20',
'nama' => 'required|string|min:3|max:50',
'nik' => 'required|string|min:16|max:16|unique:user,nik,'.$id,
'telp' => 'required|string|min:12|max:13|unique:user,telp'.$id,
'provinsi_id' => 'required',
'kota_id' => 'required',
'kecamatan_id' => 'required',
'desa_id' => 'required',
'foto' => 'mimes:jpeg,jpg,png',
'level' => 'required',
'alamat' => 'required',
]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/460829.html
上一篇:方法withCount不存在
