Laravel 的数据库迁移——migration 非常好用,但是新工作开发没有线上服务器的权限,没办法执行 artisan 命令,数据库的变动需要提交 Sql 文件运维审核后发布,因此找了一个把 migration 转成 Sql 的方法。
我的选择是写了一个 Console,可以按需调整:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class MigrationToSql extends Command
{
protected $signature = 'migrate:toSql';
protected $description = '把 migration 文件编译为Sql,方便运维部署';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$migrator = app('migrator');
$db = $migrator->resolveConnection(null);
$migrations = $migrator->getMigrationFiles('database/migrations');
$migrator->requireFiles($migrations);
$i = 0;
foreach ($migrations as $migration) {
$migrationName = $migration;
if (strstr($migration, '2021') === false) {
continue;
}
$this->info(sprintf('第%d个文件:%s', ++$i, $migrationName));
$migration = $migrator->resolve($migrator->getMigrationName($migrationName));
$queries = array_column($db->pretend(function () use ($migration) {
$migration->up();
}), 'query');
dump($queries);
}
}
}
执行结果:

每个文件是一个数组,可以输出到一个.sql文件里。