【问题标题】:Duplicate entry while using updateOrCreate()使用 updateOrCreate() 时出现重复条目
【发布时间】: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 对于每个用户都必须是唯一的,因此您不能插入已保留电子邮件的用户。此外,如果您要更新现有用户,则无法将电子邮件更改为任何已保留的电子邮件
  • 我在使用唯一用户名时遇到问题,我没有将电子邮件限制为唯一列。但除此之外:我的理解是,如果有一个用户名相同的用户,现有条目应该用新数据更新,而不是试图将新行插入数据库..

标签: php laravel lumen


【解决方案1】:
User::updateOrCreate(
        [
            'username'     => $user->username,
            'foreign_id'    => $user->foreign_id
        ],

        [
            'email'         => $user->email,
            'password'      => $user->password,                                
            'client_id'     => $user->client_id,
            'status'        => $user->active,
            'user_level'    => (integer) $user->user_level
        ])

// 第一个数组必须包含所有主键/复合键,这使其成为唯一记录

【讨论】:

  • 嗯,这在foreign_id 不是强制性的情况下可能会出现问题。 foreign_id 仅在我从旧数据库同步时使用,而如果用户是使用新系统创建的,则 foreign_id 为空。在这两种情况下,用户名都必须是唯一的..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2017-04-04
  • 1970-01-01
  • 2012-10-19
  • 2011-05-21
  • 1970-01-01
相关资源
最近更新 更多