Use Laravel Migrations to Create Database Tables

Summary: Master Laravel migrations and rollback for database version control.


Designing and managing your application's database schema is crucial for every web project. Laravel offers a powerful migration system, enabling developers to define, share, and track database changes consistently across teams and environments. In this post, we'll explore how to use Laravel migrations to create database tables and control schema versions effortlessly.

What are Laravel Migrations?

Migrations in Laravel act like version control for your database schema. They allow you to define changes (like creating, updating, or deleting tables and fields) using PHP classes, making it easy to track and share modifications within your team. These migrations can be run, rolled back, or refreshed, ensuring your database schema matches your application's requirements at all times.

Setting Up: Prerequisites

Before diving in, you'll need a few basics set up:

  • Laravel Installed: Make sure your project was initialized with Laravel.
  • Database Connection: Configure your .env file with appropriate database credentials.
  • Artisan CLI: The php artisan tool is used for generating and running migrations.

Creating a Migration

To create a migration, use the Artisan command line:

php artisan make:migration create_posts_table

This will generate a file in the database/migrations directory, following a timestamp-based naming convention. This helps Laravel keep track of the migration order.

Defining the Table Schema

Open the newly created migration file. It looks like this:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id(); // Auto-incrementing ID
            $table->string('title');
            $table->text('content');
            $table->timestamps(); // Created at & updated at columns
        });
    }

    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

Inside the migration:

  • The up() method specifies what happens when the migration runs. Here, it creates the posts table.
  • The down() method is used to reverse the migration (rollback), deleting the table.

Running Migrations

To apply all pending migrations and update your database schema, run:

php artisan migrate

This command checks the migrations table in your database to see which migrations have already been executed and runs the new ones.

Rolling Back Migrations

Made a mistake or need to revert? Laravel lets you easily rollback recent changes:

  • Rollback the last batch of migrations:

    php artisan migrate:rollback
    
  • Rollback all migrations:

    php artisan migrate:reset
    
  • Rollback & re-run all migrations in one go (often used in development):

    php artisan migrate:refresh
    

Best Practices

  • Use Descriptive Names: Name migrations clearly, e.g., create_users_table, add_status_to_posts_table, for easy tracking.
  • Small, Incremental Changes: Make one schema change per migration for easy rollbacks and debugging.
  • Never Manipulate Migrations Directly in Production: Instead, let migrations handle schema changes through Artisan commands.

Advanced: Modifying Existing Tables

Need to update a table? Just create a new migration:

php artisan make:migration add_author_to_posts_table --table=posts

Inside the migration:

public function up()
{
    Schema::table('posts', function (Blueprint $table) {
        $table->string('author')->nullable();
    });
}

public function down()
{
    Schema::table('posts', function (Blueprint $table) {
        $table->dropColumn('author');
    });
}

Conclusion

Laravel migrations provide a robust, developer-friendly way to manage your database schema, collaborate with teammates, and keep your application database in sync through every environment. By mastering migrations and rollback commands, you ensure smooth deployments and safer schema evolution.

Ready to take control of your database versioning? Start with Laravel migrations and build confidently!