Обновление схемы для одного объекта без удаления всего остального - PullRequest
2 голосов
/ 10 февраля 2012

Когда я запускаю обновление схемы, он успешно обновляет схемы для моих сущностей, но если в базе данных есть какие-либо «не-доктринные» таблицы, он удаляет их.К сожалению, эти другие таблицы требуются для сторонней CMS, которую я использую.

Есть ли способ сообщить доктрине, что нужно обновить схему для определенных объектов (или всех из них), не удаляя ничего другого?

Ниже мой существующий код обновления.Массив $classes содержит все метаданные для классов сущностей, найденных в нескольких различных плагинах.

//$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);

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Это получает все обновления sql, но анализирует любые операторы отбрасывания:

$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 );
}
0 голосов
/ 10 февраля 2012

Вы можете запустить инструмент схемы с --dump-sql вместо --force, скопировать и вставить вывод из --dump-sql и запустить его в своей базе данных вручную (конечно, удалив операторы DROP для таблиц, которые вы хотите сохранение.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...