通过laravel 4迁移执行原始SQL

ric*_*h97 8 laravel laravel-4

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

问题是我不允许任何花哨的东西,只改变网站资产和原始查询,这意味着我不能要求客户端在我需要他们对他们的暂存和实时数据库进行更改时运行laravel迁移(而且我不相信迁移足够直播.)我也无法直接访问实时数据库.

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

Bog*_*dan 11

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

php artisan migrate --pretend
Run Code Online (Sandbox Code Playgroud)

这将转储将由迁移运行的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`)
Run Code Online (Sandbox Code Playgroud)

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


Lau*_*nce 8

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

Event::listen('illuminate.query', function($sql)
{
    var_dump($sql);
}); 
Run Code Online (Sandbox Code Playgroud)

这样做,然后运行php artisan migrate- 并且所有SQL都被转储.

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