Upgrading to the builtin backend
As of migrations 4.3 there is a new migrations backend that uses CakePHP's database abstractions and ORM. In 4.4, the builtin backend became the default backend. As of migrations 5.0, phinx has been removed as a dependency and only the builtin backend is supported. This greatly reduces the dependency footprint of migrations.
What is the same?
Your migrations shouldn't have to change much to adapt to the new backend. The builtin backend provides similar functionality to what was available with phinx. If your migrations don't work in a way that could be addressed by the changes outlined below, please open an issue.
What is different?
Command Structure Changes
As of migrations 5.0, the command structure has changed. The old phinx wrapper commands have been removed and replaced with new command names:
Seeds:
# Old (4.x and earlier)
bin/cake migrations seed
bin/cake migrations seed --seed Articles
# New (5.x and later)
bin/cake seeds run
bin/cake seeds run ArticlesThe new commands are:
bin/cake seeds run- Run seed classesbin/cake seeds status- Show seed execution statusbin/cake seeds reset- Reset seed execution trackingbin/cake bake seed- Generate new seed classes
Maintaining Backward Compatibility
If you need to maintain the old command structure for existing scripts or CI/CD pipelines, you can add command aliases in your application. In your src/Application.php file, add the following to the console() method:
public function console(CommandCollection $commands): CommandCollection
{
// Add your application's commands
$commands = $this->addConsoleCommands($commands);
// Add backward compatibility aliases for migrations 4.x commands
$commands->add('migrations seed', \Migrations\Command\SeedCommand::class);
return $commands;
}For multiple aliases, you can add them all together:
// Add multiple backward compatibility aliases
$commands->add('migrations seed', \Migrations\Command\SeedCommand::class);
$commands->add('migrations seed:run', \Migrations\Command\SeedCommand::class);
$commands->add('migrations seed:status', \Migrations\Command\SeedStatusCommand::class);This allows gradual migration of scripts and documentation without modifying the migrations plugin or creating wrapper command classes.
API Changes
If your migrations are using the AdapterInterface to fetch rows or update rows you will need to update your code. If you use Adapter::query() to execute queries, the return of this method is now Cake\Database\StatementInterface instead. This impacts fetchAll(), and fetch():
// This
$stmt = $this->getAdapter()->query('SELECT * FROM articles');
$rows = $stmt->fetchAll();
// Now needs to be
$stmt = $this->getAdapter()->query('SELECT * FROM articles');
$rows = $stmt->fetchAll('assoc');Similar changes are for fetching a single row:
// This
$stmt = $this->getAdapter()->query('SELECT * FROM articles');
$rows = $stmt->fetch();
// Now needs to be
$stmt = $this->getAdapter()->query('SELECT * FROM articles');
$rows = $stmt->fetch('assoc');Unified Migrations Table
As of migrations 5.x, there is a new unified cake_migrations table that replaces the legacy phinxlog tables. This provides several benefits:
- Single table for all migrations: Instead of separate
phinxlog(app) and{plugin}_phinxlog(plugins) tables, all migrations are tracked in onecake_migrationstable with aplugincolumn. - Simpler database schema: Fewer migration tracking tables to manage.
- Better plugin support: Plugin migrations are properly namespaced.
Backward Compatibility
For existing applications with phinxlog tables:
- Automatic detection: If any
phinxlogtable exists, migrations will continue using the legacy tables automatically. - No forced migration: Existing applications don't need to change anything.
- Opt-in upgrade: You can migrate to the new table when you're ready.
Configuration
The Migrations.legacyTables configuration option controls the behavior:
// config/app.php or config/app_local.php
'Migrations' => [
// null (default): Autodetect - use legacy if phinxlog tables exist
// false: Force use of new cake_migrations table
// true: Force use of legacy phinxlog tables
'legacyTables' => null,
],Upgrading to the Unified Table
To migrate from phinxlog tables to the new cake_migrations table:
Preview the upgrade (dry run):
bin/cake migrations upgrade --dry-runRun the upgrade:
bin/cake migrations upgradeUpdate your configuration:
// config/app.php 'Migrations' => [ 'legacyTables' => false, ],Optionally drop phinx tables: Your migration history is preserved by default. Use
--drop-tablesto drop thephinxlogtables after verifying your migrations run correctly.bin/cake migrations upgrade --drop-tables
Rolling Back
If you need to revert to phinx tables after upgrading:
- Set
'legacyTables' => truein your configuration.
WARNING
You cannot rollback after running upgrade --drop-tables.
New Installations
For new applications without any existing phinxlog tables, the unified cake_migrations table is used automatically. No configuration is needed.
Problems with the builtin backend?
If your migrations contain errors when run with the builtin backend, please open an issue.