Create all your migrations and models from one JSON schema file. This package allows you to define your entire Laravel database schema in one JSON file then generates all the necessary migration files. Makes use of Jeffrey Way's Extended Generators.
For Laravel 5.4.x and above use laravel-json-schema tag 5.4.x. You might need to set your composer.json minimum-stability to dev
:
"minimum-stability": "dev"
For Laravel 5.3.x and below use laravel-json-schema tag 1.x.x
Add this package to your composer.json
file with the following command
composer require mojopollo/laravel-json-schema --dev
Add the following 2 service providers to your local environment only, by modifying your app/Providers/AppServiceProvider.php
as so:
public function register()
{
if ($this->app->environment() == 'local') {
$this->app->register('Mojopollo\Schema\MakeMigrationJsonServiceProvider');
$this->app->register('Laracasts\Generators\GeneratorsServiceProvider');
}
}
Create your JSON schema file and save as schema.json
for example:
{
"users": {
"email": "string:unique",
"password": "string:index",
"first_name": "string:nullable",
"last_name": "string:nullable",
"last_active_at": "timestamp:nullable:index"
},
"categories": {
"name": "string:unique"
}
}
If you have your JSON file, you can now generate all your migrations, using the --file=
option to specify where the JSON file is located:
php artisan make:migration:json --file=schema.json
After this command executes you will see all the newly created migration files, example output:
Model created successfully.
Migration created successfully.
Model created successfully.
Migration created successfully.
The following files have been created:
app/CartItem.php
app/Category.php
database/migrations/2016_03_13_231727_create_categories_table.php
database/migrations/2016_03_13_231728_create_tags_table.php
If you have a extensive long schema json file and want to only generate specific tables or migrations from the schema, you would do the following:
php artisan make:migration:json --file=schema.json --only=categories,tags
In the above example, the tables or migrations named "categories" and "tags" will be generated and all other tables/migrations will be ignored.
If you need to generate a pivot table, you will append _pivot
to your migration name, for example:
{
"posts_tags_pivot": null
}
This will create a pivot table migration for the tables posts
and tags
To undo and delete all files that where previously generated with the json file that was used, example:
php artisan make:migration:json --file=schema.json --undo
What this will do is look for the schema.json.undo.json
file if it exists, read the contents and remove all files that where generated, example output:
Deleting files:
Deleted: app/CartItem.php
Deleted: app/Category.php
Deleted: database/migrations/2016_03_13_231727_create_categories_table.php
Deleted: database/migrations/2016_03_13_231728_create_tags_table.php
If you prefer not to create a "undo file" in the same directory as the source json file, use the --disableundo
option at the time of migration generation:
php artisan make:migration:json --file=schema.json --disableundo
This will prevent the creation of a undo file.
To check your json file for valid json syntax and schema validation (column type definitions and column type modifiers checks):
php artisan make:migration:json --file=schema.json --validate
Note: this does not generate any migration files and will just check if you misspelled any field schema definitions
You can use table names or use a migration name that Extended Generators will understand.
For example:
{
"users": {
"email": "string:unique",
"password": "string:index"
}
}
Is the same as:
{
"create_users_table": {
"email": "string:unique",
"password": "string:index"
}
}
You can now get crazy with defining your entire database schema and having the benefit of seeing it all in one file.
As you have seen we can --undo
to remove all previously generated files from the last command then make edits to our JSON file,
validate the syntax with --validate
and then generate it all over again.
One word: WOW. :)
{
"users": {
"email": "string:unique",
"password": "string:index"
},
"create_cats_table": {
"name": "string:unique"
},
"remove_user_id_from_posts_table": {
"name": "user_id:integer"
},
"posts_tags_pivot": null
}