kobaltdigital / laravel-data-migrations
Keep data migrations apart from schema migrations in Laravel
Package info
github.com/kobalt-digital/laravel-data-migrations
pkg:composer/kobaltdigital/laravel-data-migrations
Requires
- php: ^8.2
- illuminate/console: ^11.0|^12.0|^13.0
- illuminate/database: ^11.0|^12.0|^13.0
- illuminate/filesystem: ^11.0|^12.0|^13.0
- illuminate/support: ^11.0|^12.0|^13.0
Requires (Dev)
- laravel/pint: ^1.0
- orchestra/testbench: ^9.0|^10.0|^11.0
- pestphp/pest: ^3.0|^4.0
- pestphp/pest-plugin-laravel: ^3.0|^4.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Keep data migrations (filling, fixing or purging rows) apart from schema migrations (creating and altering tables).
Data migrations live in their own folder, database/data-migrations by default, and run with the regular php artisan migrate. They share the migrations table with schema migrations and run in timestamp order, so a data migration always runs after the schema migrations it depends on. migrate:status, migrate:rollback and friends work as usual.
Installation
composer require kobaltdigital/laravel-data-migrations
The service provider is auto-discovered.
Usage
Create a data migration:
php artisan make:data-migration fill_zipcode_formats
This creates database/data-migrations/2026_09_30_141516_fill_zipcode_formats.php. Fill in up() and down() like any other migration and run php artisan migrate.
To keep data migrations out of php artisan migrate, set DATA_MIGRATIONS_RUN_WITH_MIGRATE=false and run them on demand:
php artisan migrate --path=database/data-migrations
Configuration
Publish the config file to change the defaults:
php artisan vendor:publish --tag=data-migrations-config
| Key | Default | Description |
|---|---|---|
folder |
data-migrations |
Folder inside database/ that holds the data migrations. Also settable with DATA_MIGRATIONS_FOLDER. |
path |
null |
Absolute path to store data migrations outside database/. Takes precedence over folder. |
run_with_migrate |
true |
Register the folder with Laravel's migrator so php artisan migrate, migrate:status and migrate:rollback include data migrations. Also settable with DATA_MIGRATIONS_RUN_WITH_MIGRATE. A published config without this key counts as false. |
stub |
null |
Absolute path to a custom stub for make:data-migration. |
Custom stub
Publish the stub to stubs/data-migration.stub and edit it:
php artisan vendor:publish --tag=data-migrations-stubs
The command uses the stub from the stub config key first, then the published stub, then the stub shipped with this package.
Moving an existing project over
If a project already loads a data migrations folder itself:
- Require this package.
- Remove the project's own
loadMigrationsFrom(database_path('data-migrations'))call andmake:data-migrationcommand. - Point
folderorpathat the existing folder if it is notdatabase/data-migrations.
Already executed data migrations stay recorded in the migrations table, so nothing runs twice. Existing migrations with named classes keep working; new ones are generated as anonymous classes, which avoids class name clashes.
Testing
composer test
License
The MIT License (MIT). See LICENSE.md.