toramanlis/laravel-implicit-migrations
Installation:
composer require toramanlis/laravel-implicit-migrations
Publish the config file:
php artisan vendor:publish --provider="Toramanlis\ImplicitMigrations\ImplicitMigrationsServiceProvider"
First Use Case:
Run the implicit:migrate Artisan command to generate migrations for all models in app/Models:
php artisan implicit:migrate
This inspects models (e.g., User.php) and creates corresponding migrations in database/migrations/.
Key Config:
Check config/implicit-migrations.php for:
model_paths: Directories to scan (default: app/Models).migration_namespace: Custom namespace for generated migrations.ignore_models: Exclude specific models (e.g., ['User', 'Role']).Onboarding New Models:
app/Models/Post.php).php artisan implicit:migrate to auto-generate a migration.Seeding and Factories:
DatabaseSeeder):
// database/factories/PostFactory.php
public function definition()
{
return [
'title' => 'Test Post',
'body' => 'Test content',
];
}
Partial Updates:
$fillable = ['new_field'] to User.php).php artisan implicit:migrate to update the migration file.--force to overwrite existing migrations:
php artisan implicit:migrate --force
Rollbacks and Re-runs:
php artisan migrate:rollback.php artisan migrate (generated files are idempotent).Testing:
php artisan implicit:migrate --dry-run to preview changes without writing files.php artisan implicit:migrate && php artisan migrate:fresh --env=testing
Custom Migration Logic:
app/Providers/ImplicitMigrationsServiceProvider.php:
public function boot()
{
$this->app->make('Toramanlis\ImplicitMigrations\Generators\MigrationGenerator')
->setCustomLogic(function ($table, $model) {
// Add custom columns or logic
$table->unique('email');
});
}
Excluding Specific Fields:
$hidden or $guarded in models to exclude fields:
protected $hidden = ['api_token'];
implicit-migrations.php:
'ignore_attributes' => ['remember_token', 'created_at', 'updated_at'],
Foreign Keys:
belongsTo, hasMany).Soft Deletes:
use SoftDeletes; to models and set $dates = ['deleted_at'].softDeletes() in the migration.Timestamps:
public $timestamps = false to exclude created_at/updated_at.Overwriting Migrations:
--force will delete existing migrations. Use cautiously in shared environments.Circular Dependencies:
User has Post, Post has User), migrations may fail.--force to regenerate.Reserved Keywords:
key, table, or group may cause SQL errors.Case Sensitivity:
user_id).Database-Specific Syntax:
Dry Run:
Use --dry-run to inspect generated SQL without writing files:
php artisan implicit:migrate --dry-run
Verbose Output:
Enable debug mode in implicit-migrations.php:
'debug' => true,
Or use:
php artisan implicit:migrate -v
Log Inspection:
Check storage/logs/laravel.log for errors during generation.
Model Inspection: Verify model attributes with:
php artisan tinker
>>> \Toramanlis\ImplicitMigrations\Support\Inspector::inspect(\App\Models\User::class);
Custom Generators:
$this->app->bind('implicit.migration.generator', function () {
return new \App\Generators\CustomMigrationGenerator();
});
Pre/Post-Generation Hooks:
// In EventServiceProvider
public function boot()
{
ImplicitMigrations::generating(function ($migration) {
$migration->prepend("<?php\n\nuse Illuminate\Support\Facades\Schema;\n");
});
}
Model Metadata:
class User extends Model
{
protected static $implicitMigrationOptions = [
'ignore' => ['password'],
'custom' => [
'indexes' => ['email'],
'engine' => 'InnoDB',
],
];
}
Database-Specific Config:
implicit-migrations.php:
'connections' => [
'mysql' => [
'engine' => 'InnoDB',
],
'sqlite' => [
'foreign_keys' => false,
],
],
Pair with Laravel Forge/Laravel Envoyer:
php artisan implicit:migrate --force
php artisan migrate --force
to your deployment script.
Seeders and Factories:
php artisan make:factory UserFactory --model=User
--force flag to regenerate factories when models change.Schema Dumps:
php artisan schema:dump
CI/CD Optimization:
if [ ! -f database/migrations/generated_at ]; then
php artisan implicit:migrate --force
touch database/migrations/generated_at
fi
How can I help you explore Laravel packages today?