2013-07-16 12 views
8

Ich arbeite in einer Umgebung, in der ich Änderungen nicht direkt auf den Clientservern bereitstellen muss, sondern einen Build-Tarball mit einer Änderungsliste aus einer SVN-Revision erstellen und an ihr Webteam senden muss .Raw-SQL von Laravel 4 Migrationen

Das Problem ist, dass ich nicht etwas Phantasie, nur Änderungen an der Website-Assets und rohe Abfragen erlaubt ist, bedeutet dies, ich kann nicht bitten, Laravel Migrationen ausführen, wenn ich sie brauche, um ihre Staging zu ändern & Live-Datenbanken (und ich traue sowieso nicht genug Migrationen für live.) Ich habe auch keinen direkten Zugriff auf die Live-Datenbank.

Also was ich will, ist die Erfassung der Raw SQL, wenn eine Migration ausgeführt wird, von dort kann ich genau sehen, was sich ändert, und ich kann dem Client sagen "Hier ist eine SQL-Datei von was zu ändern, überprüfen Es wird ausgeführt, wenn Sie das Update anwenden. "

Antwort

8

Wenn Sie diese Datei an den Anfang Ihrer Routes.php hinzufügen - es werden alle SQL-Dump, die von Laravel ausgeführt wird:

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

, die dies tun, dann php artisan migrate laufen - und alle SQL abgeladen wird.

Sie könnten dann in eine Datei oder etwas, um die SQL nur einloggen, anstatt eine var_dump zu tun - die Möglichkeiten sind endlos ...

+1

Perfekt! Genau das habe ich gesucht. – rich97

+0

+1, nette Verwendung. – wesside

+0

gibt es auch eine Möglichkeit, die Werte zu sehen, anstatt '?'? Verwenden Sie hier laravel 4.2 und ich bekomme das zum Beispiel: 'select roles. *, Assigned_roles.user_id als pivot_user_id, assigned_roles.role_id als pivot_role_id von den Rollen inner join assigned_roles auf roles.id = assigned_roles.role_id where assigned_roles.user_id =?;' (entfernt die Backticks) – Gizmo

11

Als alternative Lösung, die keine Event-Listener Einrichtung erfordert, können Sie verwenden Sie die --pretend Option, wenn Sie den Befehl ausführen:

php artisan migrate --pretend 

Dies wird von SQL-Abfragen Dump, die durch die Migration ausgeführt werden würde, aber ohne die Migration tatsächlich ausgeführt wird. Es wird die Ausgabe auf jeder Zeile des Klassenname der Migration und Abfrage von dieser Migration ausgeführt werden, so dass für eine Migration, die eine users Tabelle mit einer eindeutigen email Spalte erstellt hat, erhalten Sie so etwas wie diese:

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

Diese Option ist seit Laravel 4 bis zur neuesten Version von Laravel (die zu dem Zeitpunkt, zu dem ich diese Antwort poste, ist 5.1) vorhanden.

+0

Ich habe eine Migration, die alle Benutzer durchläuft, die Benutzer :: all() verwenden. Wie kann ich diese spezifische Aussage auch während der Verwendung von '--pretend' funktionieren lassen? Im "--pretend" -Modus gibt dies die Benutzer nicht zurück – Gizmo