laravel提交表单时在数据库中插入随机密码,无需输入密码

xzabzqsa  于 2021-06-19  发布在  Mysql
关注(0)|答案(4)|浏览(272)

当我提交一个没有密码输入字段的表单时,我想在数据库中插入随机密码。
我的模型用户.php

protected $fillable = [
    'email', 'firstname', 'lastname'
];

public function setpasswordAttribute($value)
{
    $this->attributes['password'] = bcrypt($value ?: str_random(10));
}

我的控制器

public function store(Request $request)
{
    User::create(Request::all());
    return 'test';
}

我的数据库

id
firstname
lastname
password
created_at
updated_at

我的错误

SQLSTATE[HY000]: General error: 1364 Field 'password' doesn't have a default value 
(SQL: insert into `users` (`email`, `firstname`, `lastname`, `updated_at`, `created_at`)
shyt4zoc

shyt4zoc1#

sqlstate[hy000]:常规错误:1364字段“password”没有默认值(sql:insert-into) users ( email , firstname , lastname , updated_at , created_at )
由于默认值 create_users_table 迁移不会为 password 字段或允许null作为值。
当你打电话的时候

User::create($request->all());

laravel对数据库执行insert查询,因为 password 如果未设置,mysql将返回sqlstate[hy000] 您可以通过修改create_users_table` 默认情况下,新创建的laravel项目会进行迁移,

Schema::create('users', function (Blueprint $table) {
        // other table columns goes here
        $table->string('password')->nullable();
        // OR 
        $table->string('password')->default("");
        // other table columns goes here
  });

这将允许您在不提供密码的情况下创建新用户,并且该列将设置为“”或保留为空,具体取决于您使用的方法,如我建议的那样修改迁移
第二个问题是 setPasswordAttribute 在您的模型上,并不意味着当您创建一个没有密码的新用户时,它会自动设置密码,您可以通过捕获 creating 将用户插入数据库之前的事件。
要做到这一点,请将此添加到您身上 EventServiceProvider ```
class EventServiceProvider extends ServiceProvider
{

/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
    parent::boot();
    User::creating(function($user){
        if($user->password === "" || empty($user->password)){
            $user->password  = bcrypt(str_random(10));;
        }
    })

}

}

此事件在用户持久化到数据库之前触发,这将允许您对要持久化到数据库中的用户上设置的所有属性进行一些修改
ttygqcqt

ttygqcqt2#

问题出在您的控制器上:控制器 User::create(Request::all()); 没有密码参数,mysql给出了正确的错误: 'password' doesn't have a default value .
你可以这样做:

public function store(Request $request)
{
    $input = Request::all();
    $input[password] = $input[password] ? $input[password] : bcrypt(str_random(10))
    User::create(Request::all());
    return 'test';
}
6rvt4ljy

6rvt4ljy3#

方法名称应为 setPasswordAttribute 不是 setpasswordAttribute .

kr98yfug

kr98yfug4#

检查您请求中的密码输入,如果不存在,请伪造密码:

public function store(Request $request)
{
    if (!$request->has('password')) {
        $password = str_random(8);
        $request->request->add(['password' => bcrypt($password)]);
    }
    User::create($request->all());
    return 'test';
}

相关问题