Laravel + MongoDB
这是我在
Store()
中的UserController
方法:
public function store()
{
$userData = request()->get('user', []);
.
.
//Checking if credentials satisfied
.
.
try
{
$user = User::create($userData);
}
catch(BulkWriteException $ex)
{
abort(409, trans('errors.EXISTS_USERNAME'));
}
catch(Exception $e)
{
abort(409, trans('errors.EXISTS_USERNAME'));
}
return [
'status' => 'success',
'result' => $user,
];
}
靠近上面代码中的Create()方法:
public static function create($parameters)
{
return static::query()->create($parameters);
}
靠近上面代码中的Create()方法:
public function create(array $attributes = [])
{
return tap($this->newModelInstance($attributes), function ($instance) {
$instance->save();
});
}
所以问题是当我删除
User
例如使用 username: "X"
时,我无法使用 User
创建新的 username: "X"
并且它给出了您在异常中看到的错误。
删除方法是软删除,这意味着用户没有从数据库中完全删除,它只是为用户提供了
deleted_at
属性,因此 Laravel 会理解该用户就像已删除的用户一样,这意味着当我使用像 User::where('username',"X")->get()
这样的查询时它不会向我显示任何结果,这意味着数据已被删除。
所以这就是交易,我不明白为什么它会抛出关于
Existing Username
的异常,而 laravel 无法将用户视为数据。
我想要做的是不使用强制删除而仅使用软删除来解决这个问题
您注意到您的用户名是一个唯一的字段。
您正在使用 Laravel 软删除。
这意味着 Laravel 将记录保留在数据库中,并在用户表的
deleted_at
内放置一个非空值。
因为数据未从数据库中删除,数据库无法创建具有相同名称“X”的新记录,因为该记录“X”已经存在——由于软删除,它在 Laravel 中似乎已被删除。
如果您想要保护唯一的用户名,这不是问题:它可以正常工作,防止您对所有用户(甚至是那些您必须删除的用户)复制
username
。您可能需要随着时间的推移保留用户数据(因此软删除),这将成功防止您重复甚至是旧的“已删除”用户。如果您不需要此保护,请从 username
中删除唯一字段。
删除用户帐户后,您可以采取以下操作以使用同一电子邮件启用注册:
用户观察者类 { /** * 处理用户“删除”事件。 * * @param \App\Models\User $user * @返回无效 */ 公共函数已删除(用户$user) { $用户->更新([ '电子邮件' => 时间() 。 '::' 。 $用户->电子邮件 ]); } }
`
AppServiceProvider 类扩展了 ServiceProvider { /** * 引导任何应用程序服务。 * * @返回无效 */ 公共函数 boot() { 用户::观察(UserObserver::class); } } `