【发布时间】:2021-11-24 20:23:57
【问题描述】:
我正在使用(最新的)Lumen,这可能是我错误的罪魁祸首。
当我使用 updateOrCreate() 时:
User::updateOrCreate(
['username' => $user->username],
[
'email' => $user->email,
'password' => $user->password,
'foreign_id' => $user->foreign_id,
'client_id' => $user->client_id,
'status' => $user->active,
'user_level' => (integer) $user->user_level
]
);
在我的一个模型上,我得到 mysql 错误:
"SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'user@name.com' for key 'users_username_unique' (SQL: insert into `users` (`username`,
因为它试图为我的唯一列之一(用户名)插入重复值。
所以,函数本身存在,我没有收到任何错误,它适用于第一次插入,但是一旦它达到检查数据库条目是否存在并且只需要更新它的功能,它仍然想创建新条目,但是重复值。
Laravel 本身的 Eloquent 中有 updateOrCreate(): https://laravel.com/docs/8.x/eloquent#upserts。 Lumen 中的 Eloquent 是否在某种程度上削弱了这个功能?
翻看Laravel或者Lumen的代码,没找到这个函数实现,最接近的是updateOrFail()...
【问题讨论】:
-
我认为问题不在 App 端。很可能其他用户有相同的电子邮件。由于 user->email 对于每个用户都必须是唯一的,因此您不能插入已保留电子邮件的用户。此外,如果您要更新现有用户,则无法将电子邮件更改为任何已保留的电子邮件
-
我在使用唯一用户名时遇到问题,我没有将电子邮件限制为唯一列。但除此之外:我的理解是,如果有一个用户名相同的用户,现有条目应该用新数据更新,而不是试图将新行插入数据库..