获取Laravel 4迁移执行的原始SQL

8
我在一种环境中工作,在这种环境下,我不能直接向客户服务器部署更改,而是必须从一个SVN修订版本号生成一个构建tar包,并将其发送给他们的Web团队。
问题在于,我只被允许修改网站资源和原始查询,无法要求客户在需要对其暂存和实际数据库进行更改时运行laravel迁移(我也不信任迁移足以应用于实际生产环境)。 我也没有直接访问实际数据库的权限。
因此,我想做的就是捕获迁移运行时的原始SQL,从那里我可以看到确切的更改内容,然后告诉客户“这是一个需要更改的SQL文件,请审核并在应用更新时运行它。”
2个回答

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

这将会输出将要运行的 SQL 查询语句,但并不实际执行迁移操作。它将在每一行输出迁移类名和从该迁移中运行的查询语句,例如创建一个具有唯一 email 列的 users 表的迁移,你将会得到如下输出:

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)。


我有一个迁移(migration)通过使用 User::all() 循环遍历所有用户,我该如何让这个特定的语句在使用 --pretend 时也能正常工作?当处于 --pretend 模式时,这个语句无法返回用户。 - Gizmo

8
如果您将以下代码添加到Routes.php文件的开头,它将输出Laravel运行的所有SQL语句:
Event::listen('illuminate.query', function($sql)
{
    var_dump($sql);
}); 

那么,先执行 php artisan migrate 命令,然后所有的SQL语句都会被输出。

你可以将SQL记录到文件中,而不是使用var_dump - 可能性是无限的...


1
太完美了!这正是我在寻找的。 - rich97
还有一种方法可以查看数值,而不是 ? 吗?我在这里使用的是 Laravel 4.2,并且我得到了例如:select roles.*, assigned_roles.user_id as pivot_user_id, assigned_roles.role_id as pivot_role_id from roles inner join assigned_roles on roles.id = assigned_roles.role_id where assigned_roles.user_id = ?;(已删除反引号) - Gizmo
有的,添加另一个名为$data的变量:Event::listen('illuminate.query', function($sql, $data) { dump($sql, $data); }); - Etienne Marais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接