无法创建与我删除的用户名相同的用户

问题描述 投票:0回答:2

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 无法将用户视为数据。

我想要做的是不使用强制删除而仅使用软删除来解决这个问题

php laravel mongodb eloquent laravel-8
2个回答
3
投票

您注意到您的用户名是一个唯一的字段。

您正在使用 Laravel 软删除。

这意味着 Laravel 将记录保留在数据库中,并在用户表的

deleted_at
内放置一个非空值。

因为数据未从数据库中删除,数据库无法创建具有相同名称“X”的新记录,因为该记录“X”已经存在——由于软删除,它在 Laravel 中似乎已被删除。

如果您想要保护唯一的用户名,这不是问题:它可以正常工作,防止您对所有用户(甚至是那些您必须删除的用户)复制

username
。您可能需要随着时间的推移保留用户数据(因此软删除),这将成功防止您重复甚至是旧的“已删除”用户。如果您不需要此保护,请从
username
中删除唯一字段。


0
投票

删除用户帐户后,您可以采取以下操作以使用同一电子邮件启用注册:

  1. 生成观察者: php artisan make:observer UserObserver --model=User

用户观察者类 { /** * 处理用户“删除”事件。 * * @param \App\Models\User $user * @返回无效 */ 公共函数已删除(用户$user) { $用户->更新([ '电子邮件' => 时间() 。 '::' 。 $用户->电子邮件 ]); } }

  1. 注册观察者:在AppServiceProvider启动方法中或者EventServiceProvider中注册观察者:

`

AppServiceProvider 类扩展了 ServiceProvider { /** * 引导任何应用程序服务。 * * @返回无效 */ 公共函数 boot() { 用户::观察(UserObserver::class); } } `

© www.soinside.com 2019 - 2024. All rights reserved.