2013-07-16 15 views
8

Pracuję w środowisku, w którym zamiast wdrażać zmiany bezpośrednio na serwerach klientów, muszę wygenerować archiwum kompilacji za pomocą listy zmian z wersji SVN i wysłać ją do ich zespołu internetowego .Uzyskiwanie surowego kodu SQL wykonywanego przez laravel 4 migracje

Problem polega na tym, że nie mam nic na ozdobę, a jedynie zmiany w zasobach witryny i nieprzetworzonych zapytaniach, co oznacza, że ​​nie mogę poprosić klienta o uruchomienie migracji w trybie laravel, gdy potrzebuję ich do zmiany lokalizacji. & Żywe bazy danych (i nie ufam migracji wystarczającej na żywo.) Nie będę mieć bezpośredniego dostępu do żywej bazy danych.

To, co chcę zrobić, to przechwycić surowy SQL podczas uruchamiania migracji. Stamtąd dokładnie widzę, co się zmienia i mogę powiedzieć klientowi: "Oto plik SQL, który należy zmienić, recenzja uruchom go po zastosowaniu aktualizacji. "

Odpowiedz

8

Jeśli dodać to na początku pliku Routes.php - będzie zrzucić wszystko SQL, który jest prowadzony przez laravel:

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

Więc to zrobić, a następnie uruchomić php artisan migrate - a wszystko SQL jest po cenach dumpingowych.

Mogłeś wtedy wystarczy zalogować SQL do pliku lub coś zamiast robić var_dump - możliwości są nieograniczone ...

+1

Idealnie! Właśnie tego szukałem. – rich97

+0

+1, ładne wykorzystanie. – wesside

+0

jest również sposób, aby zobaczyć wartości zamiast "?"? Używając tu laravel 4.2 otrzymuję na przykład: 'wybierz role. *, Assign_roles.user_id jako identyfikator_wejściowy_pola, przypisany_role_roles.role jako identyfikator przestawienia_role z ról wewnętrznych join assign_roles on roles.id = assign_roles.role_id gdzie assign_roles.user_id =?;' (usunięto backticks) – Gizmo

11

Jako alternatywne rozwiązanie, które nie wymaga konfigurowania żadnych detektorów zdarzeń, można należy wybrać opcję --pretend podczas uruchamiania komendy:

php artisan migrate --pretend 

to zrzuci zapytań SQL, które byłyby uruchamiane przez migrację, ale bez uruchamiania migracji. To będzie wyjście na każdej linii nazwę klasy migracji i zapytania prowadzony z tej migracji, więc dla migracji, który tworzy users stolik z unikalnym email kolumnie, otrzymasz coś takiego:

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

Ta opcja jest obecna od wersji Laravel 4 aż do najnowszej wersji Laravel (która w momencie zamieszczania tej odpowiedzi to 5.1).

+0

Mam migrację, która wykonuje pętle przez wszystkich użytkowników używających User :: all(). w jaki sposób uczynić ten specyficzne oświadczenie pracy nawet przy użyciu '--precyzuj'? W trybie '--pretend' nie zwraca użytkowników – Gizmo