SQLSTATE[42S22]: Column not found: 1054 Unknown column created_at and updated_at column missing

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Decoding SQLSTATE[42S22]: Why Eloquent Demands created_at and updated_at

As senior developers working with Laravel and Eloquent, we often encounter cryptic database errors. One particularly common and frustrating error is: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list'. This error signals a fundamental mismatch between what your application (Eloquent) expects the database to look like, and what the actual database schema provides.

This post will dive deep into why Eloquent tries to insert created_at and updated_at columns when you believe they don't exist, and more importantly, how to ensure your database migrations are correctly set up for robust application development.


The Mystery of Missing Timestamps

The error message you are seeing—Unknown column 'updated_at' in 'field list'—occurs because Eloquent, by default, attempts to automatically manage the creation and updating timestamps on every model instance. When you call methods like create() or save(), Eloquent attempts to insert these timestamp values into the SQL query.

The core problem is this: Eloquent assumes these columns exist in your table, but the underlying database schema (your migration) does not define them.

In your provided context, when you execute $this->building->create($buildings);, Eloquent constructs an INSERT statement that includes these fields:

sql
insert into buildings (building_name, updated_at, created_at) values (...);

If the buildings table in your database schema is missing the created_at and updated_at columns, the database throws an error because it cannot find those specified columns to populate.

How Eloquent Manages Timestamps

Eloquent provides a convenient way to handle these timestamps without manually managing them in your repository or controller logic. This functionality is typically enabled by adding the timestamps() method to your Eloquent models.

When you use this feature, Eloquent handles setting these values automatically whenever a model is saved or updated. This pattern is fundamental to leveraging the power of an ORM like Laravel’s Eloquent framework. For more advanced insights into how Laravel structures its data layer, understanding the underlying principles of Eloquent is key, as detailed on the official Laravel documentation.

The Solution: Fixing Your Database Schema

The solution to this issue is not in your repository or controller code; it lies entirely within your database migrations. You must explicitly tell the database that these two columns exist before Eloquent attempts to use them.

Step 1: Verify and Update Migrations

You need to ensure that when you created the migration for your buildings table, you included the necessary timestamp columns.

If you are starting a new model or fixing an existing one, generate a fresh migration:

bash
php artisan make:migration add_timestamps_to_buildings_table --table=buildings

Then, update the generated migration file (e.g., database/migrations/..._add_timestamps_to_buildings_table.php) to include the timestamp columns:

php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\SchemaBuilder;

class AddTimestampsToBuildingsTable extends Migration
{
    public function up()
    {
        SchemaBuilder::table('buildings', function (SchemaBuilder $table) {
            // Add the timestamps here
            $table->timestamps();
        });
    }

    public function down()
    {
        SchemaBuilder::table('buildings', function (SchemaBuilder $table) {
            // Rollback
            $table->dropTimestamps();
        });
    }
}

After making this change, run your migrations to apply the schema update:

bash
php artisan migrate

Step 2: Ensure Model Configuration

Finally, confirm that your Building.php model correctly signals to Eloquent that it should manage these timestamps. This is done by ensuring the timestamps property is set to true (which is the default):

php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Building extends Model
{
    // This ensures Eloquent knows to manage created_at and updated_at
    public $timestamps = true; 

    protected $fillable = [
        'id', 'building_name', 'building_information', 'building_image', 
    ];
}

By correctly defining the schema via migrations and ensuring your Eloquent models are configured, you eliminate this error and establish a solid foundation for managing relational data in Laravel.

Conclusion

The SQLSTATE[42S22] error is a classic reminder that application logic must align perfectly with database structure. In the world of ORMs like Eloquent, the framework relies on the database schema to function correctly. Always treat your migrations as the single source of truth for your table structures. By ensuring timestamps() are included in your migration files and confirming model settings, you ensure that your application remains clean, robust, and fully compliant with Laravel's conventions.