
Set Default Db Column Values In Eloquent Model
I have worked on several projects, and in one case I needed to set a default value for a column in one of my tables. At first, I thought it worked fine and did the job. But then I started asking myself: what if one day I need to change that default value? Of course, that would mean I’d have to modify the table migration in my database again.
From that moment, I began to wonder if there was another way to define a default value—one that could be changed anytime without touching the database migration. And it turns out, Laravel already provides us with a much more practical solution.
So If you want to set the default values for the database table column, you can do it in Migrations, using the default() method:
Schema::create('posts', function (Blueprint $table) { $table->id(); $table->boolean('is_published')->default(false); $table->integer('view_count')->default(0); $table->string('status')->default('draft'); $table->timestamps(); });
This would set the defaults on the database level.
But did you know you can also set them in the Eloquent Model, instead? Use the $attributes property for this.
app/Models/Post.php:
class Post extends Model { protected $attributes = [ 'is_published' => false, 'view_count' => 0, 'status' => 'draft', ]; }
With this approach, new model instances will have these default values before they're saved. As a result, you would be able to change the default values, without changing/migrating the database structure.
Link to the Laravel docs: Eloquent: Default Attribute Values