更新一个实体的模式而不删除其他所有实体

时间:2012-02-09 21:20:14

标签: doctrine-orm

当我运行模式更新时,它成功更新了我的实体的模式,但是如果数据库中有任何“非教条”表,则删除它们。不幸的是,我正在使用的第三方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 个答案:

答案 0 :(得分:1)

这将获取所有更新sql但解析掉任何drop语句:

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

答案 1 :(得分:0)

您可以使用--dump-sql而不是--force运行架构工具,复制并粘贴--dump-sql的输出并手动在数据库上运行(当然删除DROP您要保留的表的语句。)