这适用于创建/存储,但不适用于编辑/更新。我希望用户被更新,数据已经存在于数据库中,验证错误出现。像这样在用户存储中,我添加了数据,它工作,即使已经有相同的数据然后验证错误出现,但在不同的更新,如果我只更新地址,那么旧的用户名数据仍然使用,如果我改变用户名,它也工作,但它不't如果我用现有的用户名替换用户名,验证错误不会出现,而是显示以下错误。请帮助我,我仍然是一名学生!
错误:
数据库状态[23000]:完整性约束冲突:1062关键字'user_username_unique'的条目'asdf'重复(SQL:更新user
设置username
= asdf,password
= $2y$10$BYdD到N5jCCuRLdZx70YA. BFgyVIWulL8n/bv5C3VxOVCw6WBN.kO,kota_id
= 1505,kecamatan_id
= 1505013,desa_id
= 1505013004,user
. updated_at
= 2022年4月9日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');
}
4条答案
按热度按时间mwngjboj1#
∮原因∮
上述错误由SQL数据库引发,说明您正在尝试更新记录但
username
已存在并被另一记录使用。这就是为什么我要求澄清,"您对sql
unique
约束了解多少?"通过使用Laravel Validation使用
unique
规则验证用户输入,您可以在一定程度上避免出现该错误:你已经有了一个关于
store
函数的完美的工作示例。上面的声明告诉Laravel检查我们在user
表中是否有username
。但是,您的
update
函数不会验证您声明的username
字段:上面的声明意味着 "检查
username
是否已经存在于user
表的id
列上。" Laravel然后检查id
列上的username
。因此,Laravel认为username
不存在于该表上。幸运的是,您在迁移时声明了要确保username
是唯一的-这就是为什么您会出现这个特定错误。解决方案
您可以从编辑程序中排除
username
,或更新您的确认以从击发确认错误中排除使用的username
。Rule::unique('user')->ignore($user->id)
表示Laravel必须确保username
不被除给定主键$user->id
之外的记录使用。用
Rule::unique('user')->ignore($user->id)
替换'unique:user,id'
将确保username
相对于除当前记录之外的所有其他记录是唯一的。这就是Andreas Bilz链接到Laravel文档的意思。注:
...
)用于缩短语句fhity93d2#
我认为您需要的是制定一个规则,“排除”当前用户,以检查其已经拥有的属性的唯一性:https://laravel.com/docs/5.8/validation#rule-unique
jfgube3f3#
您可以使用此代码,它不会检查与您传递的ID对应的记录。假设您正在更新一个用户,该用户的ID = 1,username = 'test',email =test@test.com您要更新用户名,则它不会给予email错误,因为它将检查除ID = 1之外的所有其他记录
lstz6jyr4#
我也遇到过同样的问题,但是我解决了它。问题是关于种子的。当执行
php artisan migrate:refresh --seed
时,如果你有与你的种子匹配的虚拟数据,那么错误就会出现。如何解决:
转到database/seeds/DatabaseSeeder.php。删除
UsersTableSeeder::class
并让虚拟用户进行迁移。运行php artisan migrate:refresh --seed
。问题解决。