Laravel在提交没有密码输入的表单时在数据库中插入随机密码

时间:2018-09-20 13:04:35

标签: php mysql laravel

当我提交没有密码输入字段的表单时,我想在数据库中插入随机密码。

我的模型User.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`)

4 个答案:

答案 0 :(得分:0)

问题出在您的控制器上: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';
}

答案 1 :(得分:0)

检查您的请求中是否输入了密码,如果不存在,则将其伪造:

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';
}

答案 2 :(得分:0)

  

SQLSTATE [HY000]:常规错误:1364字段'password'没有默认值(SQL:插入usersemailfirstname,{{1} },lastnameupdated_at

由于默认的created_at迁移不向create_users_table字段提供默认值或不允许将null用作值,因此出现此错误。

致电时

password

laravel对数据库执行插入查询,并且由于未设置User::create($request->all()); ,MySQL将返回SQLSTATE [HY000]

您可以通过修改password迁移来解决此问题,默认情况下,该迁移是新创建的laravel项目附带的,

create_users_table

这将允许您在不提供密码的情况下创建新用户,并且该列将设置为“”或保留为空,具体取决于您用来修改迁移的方法(如我建议的那样)

第二次在模型上取消 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

此事件是在用户保留在数据库中之前触发的,这将使您可以对要保留在数据库中的用户已经设置的所有属性进行一些修改

答案 3 :(得分:0)

您的方法名称应为setPasswordAttribute,而不是setpasswordAttribute