8

我在一个环境中工作,而不是将更改直接部署到客户端服务器,我必须生成一个带有来自 SVN 修订版的更改列表的构建 tarball,并将其发送给他们的网络团队。

问题是我不允许任何花哨的东西,只能更改站点资产和原始查询,这意味着当我需要客户更改他们的登台和实时数据库时,我不能要求他们运行 laravel 迁移(而且我无论如何都不太信任迁移。)我也无法直接访问实时数据库。

所以我想做的是在运行迁移时捕获原始 SQL,从那里我可以确切地看到发生了什么变化,我可以告诉客户“这是一个需要更改的 SQL 文件,查看它并运行它当您应用更新时。”

4

2 回答 2

11

作为不需要设置任何事件侦听器的替代解决方案,您可以--pretend在运行命令时使用该选项:

php artisan migrate --pretend

这将转储迁移将运行的 SQL 查询,但不会实际运行迁移。它将在每一行输出迁移的类名和从该迁移运行的查询,因此对于创建users具有唯一email列的表的迁移,您将得到如下内容:

CreateUsersTable: create table `users` (`id` int unsigned not null auto_increment primary key, `email` varchar(255) not null, `password` varchar(60) not null, `created_at` timestamp default 0 not null, `updated_at` timestamp default 0 not null) default character set utf8 collate utf8_unicode_ci
CreateUsersTable: alter table `users` add unique users_email_unique(`email`)

从 Laravel 4 到 Laravel 的最新版本(当时我发布这个答案是 5.1),这个选项就存在了。

于 2015-06-16T16:42:03.443 回答
8

如果将它添加到Routes.php文件的开头 - 它会转储 Laravel 运行的所有 SQL:

Event::listen('illuminate.query', function($sql)
{
    var_dump($sql);
}); 

这样做,然后运行php artisan migrate——所有的 SQL 都被转储了。

然后,您可以将 SQL 记录到文件或其他东西而不是执行 var_dump - 可能性是无穷无尽的......

于 2013-07-16T10:47:56.797 回答