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

Posted

技术标签:

【中文标题】获取 laravel 4 迁移执行的原始 SQL【英文标题】:Getting raw SQL performed by laravel 4 migrations 【发布时间】:2013-07-14 09:14:10 【问题描述】:

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

问题是我不允许任何花哨的东西,只能更改站点资产和原始查询,这意味着当我需要客户更改他们的暂存和实时数据库(无论如何我对迁移的信任度不够。)我也无法直接访问实时数据库。

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

【问题讨论】:

【参考方案1】:

作为不需要设置任何事件监听器的替代解决方案,您可以在运行命令时使用--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),此选项都存在。

【讨论】:

我有一个使用 User::all() 遍历所有用户的迁移。即使在使用 --pretend 时,如何使这个特定的语句起作用?在--pretend 模式下,这不会返回用户【参考方案2】:

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

Event::listen('illuminate.query', function($sql)

    var_dump($sql);
); 

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

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

【讨论】:

完美!这正是我想要的。 是否还有一种方法可以查看值,而不是 ??在这里使用 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 = ?;(删除了反引号) 是的,添加另一个名为$data的变量:Event::listen('illuminate.query', function($sql, $data) dump($sql, $data); );

以上是关于获取 laravel 4 迁移执行的原始 SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel迁移中编辑原始表?

在执行查询之前,如何从 Laravel 的查询构建器中获取原始查询字符串?

如何在执行查询之前从Laravel的查询生成器获取原始查询字符串?

关于 SQLl*Plus 集合语句

Laravel 5.4 迁移错误 [42501]

PHP Laravel迁移SQL问题[重复]