强制删除后,Laravel重复输入

时间:2016-04-12 19:30:59

标签: php mysql laravel

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

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

注册新用户的问题并不像“电子邮件”那样有效。列是唯一的,软删除的记录仍然存在。

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

那么物理删除旧记录并使用旧ID创建一个新记录?对?不工作。

对记录工作调用forceDelete(),它会将其从数据库中删除,但随后尝试创建一个新记录会立即抛出一个重复的密钥'例外。刷新页面不再是问题,因为它没有看到旧记录。

似乎错误来自MYSQL本身,虽然php应该在执行insert查询之前等待对delete查询的响应,所以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重复条目   ' whoever@mail.com'关键字' users_email_unique'

有谁知道这是为什么?有一个简单的解决方案吗?

3 个答案:

答案 0 :(得分:0)

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

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

$user->restore();

要确定某个模型实例是否已被软删除,您可以使用trashed方法:

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

答案 1 :(得分:0)

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

我读过某个我必须打电话的地方

$found->save()

更新已删除的记录,但仍然无效。

奇怪的是,切换到

$found->update()

的工作。

答案 2 :(得分:0)

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

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