This package allows you to configure migrations to run based on a condition. We
expose a ConditionalMigration
interface, which you can have your migrations
implement to determine whether or not it should run.
You'll have to follow a couple of steps to install this package.
Via composer:
$ composer require onlinepets/laravel-conditional-migrations
Or add the package to your dependencies in composer.json
and run
composer update
on the command line to download the package:
{
"require": {
"onlinepets/laravel-conditional-migrations": "^1.0"
}
}
If you're not using auto discovery,
register the \Onlinepets\ConditionalMigrations\ServiceProvider
in config/app.php
:
'providers' => [
// ...
Onlinepets\ConditionalMigrations\ServiceProvider::class,
];
To make sure a migration only runs between 1 AM and 2 AM, implement the ConditionalMigration
interface and its ->shouldRun()
method:
use Onlinepets\ConditionalMigrations\Contracts\ConditionalMigration;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Carbon;
class DoSomethingVeryIntensive extends Migration implements ConditionalMigration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
//
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
//
});
}
public function shouldRun(): bool
{
return (new Carbon('1 AM'))->lessThan(now())
&& (new Carbon('2 AM'))->greaterThan(now());
}
}
The code snippet above will make sure the do_something_very_intensive
migration
will be skipped unless it is executed between 1 AM and 2 AM. This can be useful
if your migration does something that should not be run during the daytime, like
adding an index to a table containing lots of data.
To take full advantage of this package, you can schedule a task to migrate the database during the "whitelisted" times. This package does not implement this.
You can optionally publish the configuration file:
$ php artisan vendor:publish --provider="Onlinepets\ConditionalMigrations\ServiceProvider"
This will create the file config/conditional-migrations.php
, which is where you can
configure whether your migrations should run, regardless of individual configuration:
return [
'always_run' => env('APP_DEBUG', false),
];
You can also use a closure if you want to do more advanced calculations:
return [
'always_run' => function (): bool {
// calculate whether it should run
},
];
All contributions (pull requests, issues and feature requests) are welcome. Make sure to read through the CONTRIBUTING.md first, though. See the contributors page for all contributors.
onlinepets/laravel-conditional-migrations
is licensed under the MIT License (MIT). Please
see the license file for more information.