Laravel вставляет случайный пароль в базу данных при отправке формы без ввода пароля - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу вставить случайный пароль в базу данных при отправке формы без поля ввода пароля.

моя модель 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 голосов
/ 20 сентября 2018

Ваше имя метода должно быть setPasswordAttribute, а не setpasswordAttribute.

0 голосов
/ 20 сентября 2018

Проверьте ввод пароля в вашем запросе и, если он не существует, просто подделайте его:

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';
}
0 голосов
/ 20 сентября 2018

SQLSTATE [HY000]: общая ошибка: 1364 Поле «пароль» не имеет значения по умолчанию (SQL: вставить в users (email, firstname, lastname, updated_at, created_at)

Вы получаете эту ошибку, потому что миграция по умолчанию create_users_table не предоставляет значение по умолчанию для поля password или допускает пустое значение в качестве значения.

когда вы вызываете

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

laravel, чтобы выполнить запрос на вставку в базу данных, и поскольку 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));;
            }
        })

    }
}

это событие инициируется до того, как пользователь сохраняется в базе данныхи это позволит вам внести некоторые изменения во все атрибуты, которые уже установлены для пользователя, которого вы хотите сохранить в базе данных

0 голосов
/ 20 сентября 2018

Проблема в вашем контроллере: 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';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...