提问者:小点点

强制删除后laravel重复入口


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

尝试处理用户被软删除并希望再次创建帐户的情况。

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

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

所以物理删除旧记录并用旧ID创建一个新记录?对吗?不起作用。

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

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

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

我也在使用哨兵身份验证包,如果这是相关的。

这是基本代码:

$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'

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


共3个答案

匿名用户

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

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

$user->restore();

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

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

匿名用户

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

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

$找到-

更新已删除的记录,但这仍然不适合我。

奇怪的是,切换到

$找到-

工作。

匿名用户

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

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