I have some fields in user table:
id firstName lastName userName
Here I need to generate and save an userName automatically where the user will provide only firstname & lastName. I have tried something like this but not sure about the piece of code.
User.php
class User extends Authenticatable{ ... protected $appends = ['firstName', 'lastName', 'userName']; protected $attributes = ['userName' => 'default']; public static function boot() { parent::boot(); // TODO: Change the autogenerated stub self::creating(function ($model) { $randNum = rand(10, 99); $userName = $model['firstName'] . $model['lastName'] . $randNum; $model->userName = $userName; }); } }
So whenever I’m trying to migrate & seed it’s showing
Field ‘userName’ doesn’t have a default value
The seeder is
public function run() { DB::table('users')->insert([ 'firstName' => 'Osman', 'sureName' => 'Rafi', 'email' => 'rafi.ogchy@gmail.com', 'password' => Hash::make('password'), ]); }
Advertisement
Answer
What you’re looking for is Model events.
First define a static boot method on your model. In there you can then run your username generation code.
class User extends Model { public static function boot() { parent::boot(); self::creating(function($model){ $randNum = rand(10, 99); $userName = $model['firstName'] . $model['lastName'] . $randNum; $model['userName'] = $userName; }); } }
This will intercept the creation of your model, and generate the username.