Back to the future: database migrations with dates from the past

Migrations are a really useful tool to keep the database structure in sync with all environments and for all team members. And whenever we generate a new migration – its filename has a pattern of date_time_name.php. But what if you need to add a table which was in the database long time ago and created manually? How to add it into migrations folder and specify its time in the past?

Actually, Artisan command make:migration does the only thing – generates the file. But that file can be generated manually without terminal or command prompt.

So let’s try it. Let’s assume the situation that we have a fresh Laravel installation and already have run default migrations for Auth tables – so our migrations table looks like this:


Now let’s just open a default Laravel migration file 2014_10_12_000000_create_users_table.php and rename it to a month earlier and a table categories. Don’t forget to rename a classname too, here’s how new file 2014_09_12_000000_create_categories_table.php looks:

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

class CreateCategoriesTable extends Migration
     * Run the migrations.
     * @return void
    public function up()
        Schema::create('categories', function (Blueprint $table) {

     * Reverse the migrations.
     * @return void
    public function down()

So now we have three files in migrations folder.


Now, let’s run artisan migrate. What do you think will happen? Will it fail? Will it generate the table? Here’s the result:


As you can see, it all went ok. Migration file launched successfully – here’s the updated migrations table:


So there’s a new batch created – that’s it. Actually, Laravel doesn’t really care about migration file names, it just checks the whole folder and runs all the files that are not present in migrations table. That date-time prefix in filenames is just a helping hand for developers to remember when it was actually done. So if you need to add past migration with a different date than today – as you can see, there’s no problem.

Like our articles?
Check out our Laravel online courses!


  1. In fact, the timestamp serves to something more important: it tells Laravel the order migrations should run.
    For example, when one table depends on another one, Laravel needs to migrate the database in a specifc order to avoid errors.


Please enter your comment!
Please enter your name here