使用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'
有谁知道这是为什么?有一个简单的解决方案吗?
答案 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();
}