2015-08-28 13 views
5

Se corroSymfony2 schema aggiornamento dottrina da un'entità specifica

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

vi aggiornerò il mio database da tutte le entità.

Ho bisogno di aggiornare il database solo per l'entità Utente, qual è la soluzione?

Uno di soluzione è definire personalizzato gestore di entità e quando il passaggio entità thay manager per

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

Ma forse exisgts qualcosa di più veloce, senza definig gestore di entità personalizzata?

risposta

9

Secondo la documentazione di comando, non esiste tale opzione. Se questo è qualcosa che devi fare solo una volta, ti suggerirei di usare l'opzione --dump-sql per ottenere le istruzioni SQL richieste e di eseguire manualmente quelle che ti servono.

P.S. Non riesco a capire quale sia la ragione per aggiornare solo lo schema di un'entità e lasciare tutto il resto delle entità non sincronizzato con il database. Sembra una ricetta per ottenere errori db.

+3

Attualmente mi trovo in una situazione del genere (e poiché ti stai chiedendo perché qualcuno vorrebbe farlo). Ho un DB da un vecchio sistema legacy che è stato fatto molto male. E mi viene chiesto di estrarre determinate entità a determinate condizioni. Trovo più facile avere la mappa della dottrina a parte delle entità per fare confronti piuttosto che andare a fare domande (ho un senso?) Quindi voglio aggiungere un'entità che mi aiuterà a confrontare i dati ma non voglio eseguire un aggiornamento di massa su tutto il db che può rischiare di cancellare le informazioni. –

+0

@JoeYahchouchi sì, ha senso. Se ho capito bene, hai un'entità Doctrine parzialmente mappata con il database perché ciò aiuta a scrivere il tuo codice, ma non vuoi sincronizzare automaticamente la definizione dell'entità con la struttura della tabella perché la tabella ha altri campi/diversi. Quindi la soluzione di cui sopra ha senso. Un modo completamente diverso per andare sarebbe usare [migrazioni] (http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html) ma non è esattamente quello che l'OP chiedeva. –

+0

sì esattamente questa è la mia situazione, entità parzialmente mappata. Ho finito per aggiungere manualmente colonne e tabelle e volevo e procedendo da lì. Le migrazioni avrebbero funzionato se mi preoccupassi di avere uno scenario ripetibile. –

0

È possibile utilizzare manualmente la classe Doctrine SchemaTool per generare un differenziale SQL basato solo su una singola entità. Avrai bisogno di accedere a EntityManager di Doctrine - l'esempio seguente presuppone l'accesso al contenitore di 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); 

La variabile $sqlDiff ora conterrà una serie di istruzioni SQL che sono necessari per portare lo schema del database al passo con la mappatura entità.

Il secondo argomento passato a SchemaTool::getUpdateSchemaSql() è importante: senza di esso, il comportamento predefinito sarebbe generare le istruzioni DROP TABLE per ogni altra tabella visualizzata nel database.

Problemi correlati