2015-08-28 33 views
5

Jeśli biegnęSymfony2 schematu zmiana doktryny od konkretnego podmiotu

php app/console doctrine:schema:update --force 

będę aktualizować bazę danych od wszystkich podmiotów.

Potrzebuję aktualizacji bazy danych tylko dla użytkownika, co to jest rozwiązanie?

Jedno rozwiązanie jest zdefiniowanie niestandardowego kierownik podmiotu i kiedy kierownik karnet podmiot Thay do

php app/console doctrine:schema:update --force --em="custom" 

Ale może exisgts coś szybciej bez definig kierownika jednostki na zlecenie?

Odpowiedz

9

Zgodnie z dokumentacją polecenia, nie ma takiej opcji. Jeśli jest to coś, co musisz zrobić tylko raz, proponuję użyć opcji --dump-sql, aby uzyskać wymagane instrukcje SQL i ręcznie uruchomić te, których potrzebujesz.

P.S. Nie rozumiem, jaki jest powód, aby aktualizować schemat tylko dla jednostki i pozostawić wszystkie pozostałe elementy niezsynchronizowane z bazą danych. To brzmi jak przepis na otrzymywanie błędów db.

+3

Obecnie jestem w takiej sytuacji (a ponieważ zastanawiasz się, dlaczego ktoś chciałby to zrobić). Mam DB z bardzo starego systemu, który został bardzo źle zrobiony. I jestem proszony o wyodrębnienie pewnych podmiotów pod pewnymi warunkami. Uważam, że łatwiej jest mieć mapę doktryn do części jednostek, aby robić porównania, niż samemu ingerować w zapytania (czy to ma sens?) Więc chcę dodać jedną jednostkę, która pomoże mi porównywać dane, ale nie chcę uruchamiać aktualizację masową dla całej bazy danych, która może spowodować ryzyko usunięcia informacji. –

+0

@JoeYahchouchi tak, to ma sens. Jeśli dobrze rozumiem, masz jednostkę Doctrine częściowo zmapowaną z bazą danych, ponieważ pomaga to w pisaniu kodu, ale nie chcesz automatycznie synchronizować definicji jednostki ze strukturą tabeli, ponieważ tabela zawiera inne/różne pola. Wtedy powyższe rozwiązanie ma sens. Zupełnie innym sposobem byłoby użycie [migracje] (http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html), ale nie jest to dokładnie to, o co prosił OP. –

+0

tak dokładnie to jest moja sytuacja, częściowo zmapowany podmiot. Skończyło się na tym, że dodałem kolumny i tabele, a potem chciałem i kontynuowałem. Migracje zadziałałyby, gdybym chciał mieć powtarzalny scenariusz. –

0

Możesz ręcznie użyć klasy Doctrine SchemaTool, aby wygenerować różnicę SQL opartą tylko na jednym obiekcie. Będziesz potrzebował dostępu do EntityManager Doctrine - poniższy przykład zakłada dostęp do kontenera Symfony.

use Doctrine\ORM\Tools\SchemaTool; 

$em = $this->container->get('doctrine')->getManager(); 
$schemaTool = new SchemaTool($em); 
$metadata = $em->getClassMetadata(YourEntity::class); 
$sqlDiff = $schemaTool->getUpdateSchemaSql([$metadata], true); 

Zmienna $sqlDiff będzie teraz zawierać tablicę SQL, które są potrzebne w celu doprowadzenia schematu bazy danych na bieżąco ze swoim mapowania podmiotu.

Drugi argument przekazany do SchemaTool::getUpdateSchemaSql() jest ważny - bez niego domyślnym zachowaniem byłoby generowanie instrukcji DROP TABLE dla każdej innej tabeli, która pojawia się w bazie danych.