【问题标题】:Laravel duplicate entry after force delete强制删除后Laravel重复条目
【发布时间】:2020-11-10 15:39:48
【问题描述】:

使用 Laravel 4.2 应用程序(是的,这是一个不值得升级的旧应用程序)

尝试处理用户被软删除并想重新创建帐户的情况。

遇到注册新用户不起作用的问题,因为“电子邮件”列是唯一的,并且软删除的记录仍然存在。

我更愿意创建一个新的用户记录(所有其他字段为空),具有相同的递增 ID 以保持与其他软删除记录的关系。

所以物理上删除旧记录并使用旧 ID 创建一个新记录?正确的?不工作。

在记录上调用 forceDelete() 有效,它确实将其从数据库中删除,但随后立即尝试创建新记录会引发“重复键”异常。刷新页面不再是问题,因为它看不到旧记录。

似乎错误来自MYSQL本身,虽然php应该在执行插入查询之前等待对删除查询的响应,所以此时mysql应该知道记录已被删除。

这个错误是否可能实际上来自 Laravel 中的某种内存缓存?

如果相关的话,我也在使用 Sentinel 身份验证包。

这是基本代码:

$found = User::where('email', $email)->first();

if ($found->deleted_at) {

    $old_id = $found->id;

    $found->forceDelete();
    $found->save();

    $unique_id = $this->generateUnique(NULL, $first_name . $last_name);

    $user = Sentinel::registerAndActivate(array(
        'id' => $old_id,
        'email' => $email,
        'password' => $password,
        'first_name' => $first_name,
        'last_name' => $last_name,
        'unique_id' => $unique_id,
        'preferred_lang' => $this->locale,
    ));
}

这会导致

SQLSTATE[23000]:违反完整性约束:1062 重复条目 键 'users_email_unique' 的 'whoever@mail.com'

有人知道这是为什么吗?有没有简单的解决办法?

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    来自文档 (https://laravel.com/docs/4.2/eloquent):

    要将软删除的模型恢复为活动状态,请使用 restore 方法:

    $user->restore();
    

    要确定给定模型实例是否已被软删除,您可以使用垃圾箱方法:

    if ($user->trashed())
    {
    //
    }
    

    【讨论】:

    • 对不起,我应该更清楚一点,我不想简单地恢复记录。这样做的原因是我希望它显示为新的用户记录,并且我根据模型事件创建历史记录。 IE。恢复将导致“更新”历史记录而不是“创建”。
    【解决方案2】:

    我实际上让我的代码工作了......

    我在某个地方读到了我不得不打电话的地方

    $found->save()

    更新已删除的记录,但这对我仍然不起作用。

    奇怪的是,切换到

    $found->update()

    工作。

    【讨论】:

      【解决方案3】:

      您可以像这样恢复已删除的行:

      $deletedRow = User::withTrashed()->where('email', $email)->first();
      if($deletedRow) {
            $deletedRow->restore();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-22
        • 2018-03-22
        • 2018-10-16
        • 2010-12-17
        • 2014-12-28
        • 2014-08-01
        相关资源
        最近更新 更多