2 Stimmen

Aktualisierung des Schemas für eine Entität, ohne alles andere zu löschen

Wenn ich eine Schemaaktualisierung durchführe, werden die Schemata für meine Entitäten erfolgreich aktualisiert, aber wenn es irgendwelche "Nicht-Doktrin"-Tabellen in der Datenbank gibt, werden sie gelöscht. Leider sind diese anderen Tabellen für das CMS eines Drittanbieters, das ich verwende, erforderlich.

Gibt es eine Möglichkeit, Doctrine anzuweisen, das Schema für bestimmte Entitäten (oder alle) zu aktualisieren, ohne etwas anderes zu löschen?

Nachstehend finden Sie meinen bestehenden Aktualisierungscode. Die $classes Array enthält alle Metadaten für Entity-Klassen, die in mehreren verschiedenen Plugins zu finden sind.

//$em is an instance of EntityManager

//Psuedo Code
$classes = array(
     $em->getClassMetadata('class1'),
     $em->getClassMetadata('class2'),
     $em->getClassMetadata('class3'),
     $em->getClassMetadata('class4'),
     $em->getClassMetadata('class5'),
);

//Real Code
$st = new Doctrine\ORM\Tools\SchemaTool( $em );
if ($classes)
    $st->updateSchema($classes);

1voto

orourkedd Punkte 6061

Dadurch werden alle Aktualisierungs-Sql abgerufen, aber alle Drop-Anweisungen herausgefiltert:

$sql = $st->getUpdateSchemaSql( $classes );

$count = count($sql);
for($i=0; $i<$count; $i++)
{
    if(substr($sql[$i], 0, 4) == 'DROP')
        unset($sql[$i]);
}

foreach($sql as $statement)
{
    $em->getConnection()->exec( $statement );
}

0voto

Pete Mitchell Punkte 2869

Sie können das Schema-Tool mit --dump-sql anstelle von --force kopieren und fügen Sie die Ausgabe von --dump-sql und führen Sie es manuell in Ihrer Datenbank aus (wobei Sie natürlich die DROP Anweisungen für die Tabellen, die Sie beibehalten wollen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X