laravel 数据库状态[23000]:完整性约束冲突:1062关键字'user_username_unique'的条目'asdf'重复(SQL:更新'用户'设置'用户名'= asdf

q0qdq0h2  于 2023-02-10  发布在  其他
关注(0)|答案(4)|浏览(97)

这适用于创建/存储,但不适用于编辑/更新。我希望用户被更新,数据已经存在于数据库中,验证错误出现。像这样在用户存储中,我添加了数据,它工作,即使已经有相同的数据然后验证错误出现,但在不同的更新,如果我只更新地址,那么旧的用户名数据仍然使用,如果我改变用户名,它也工作,但它不'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');
}
mwngjboj

mwngjboj1#

∮原因∮

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'asdf' for key 'user_username_unique' (SQL: update `user` set `username` = asdf, `password` = ...)

上述错误由SQL数据库引发,说明您正在尝试更新记录username已存在并被另一记录使用。
这就是为什么我要求澄清,"您对sql unique约束了解多少?"
通过使用Laravel Validation使用unique规则验证用户输入,您可以在一定程度上避免出现该错误:

$request->validate(['username' => [..., 'unique:user'], ...]);

你已经有了一个关于store函数的完美的工作示例。上面的声明告诉Laravel检查我们在user表中是否有username
但是,您的update函数不会验证您声明的username字段:

$request->validate(['username' => [..., 'unique:user,id'],...]);

上面的声明意味着 "检查username是否已经存在于userid上。" Laravel然后检查id列上的username。因此,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之外的记录使用。
Rule::unique('user')->ignore($user->id)替换'unique:user,id'将确保username相对于除当前记录之外的所有其他记录是唯一的。这就是Andreas Bilz链接到Laravel文档的意思。
注:

  • 省略号(...)用于缩短语句
  • 如果您的应用程序被多个用户使用,您应该注意SQL错误,并在原子性成为强制性时考虑事务(请参见:交易)
  • 对想帮忙的人要友善
fhity93d

fhity93d2#

我认为您需要的是制定一个规则,“排除”当前用户,以检查其已经拥有的属性的唯一性:https://laravel.com/docs/5.8/validation#rule-unique

jfgube3f

jfgube3f3#

您可以使用此代码,它不会检查与您传递的ID对应的记录。假设您正在更新一个用户,该用户的ID = 1,username = 'test',email =test@test.com您要更新用户名,则它不会给予email错误,因为它将检查除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',
]);
lstz6jyr

lstz6jyr4#

我也遇到过同样的问题,但是我解决了它。问题是关于种子的。当执行php artisan migrate:refresh --seed时,如果你有与你的种子匹配的虚拟数据,那么错误就会出现。

如何解决:

转到database/seeds/DatabaseSeeder.php。删除UsersTableSeeder::class并让虚拟用户进行迁移。运行php artisan migrate:refresh --seed问题解决。

相关问题