使用Doctrine更新架构而不删除每个表?

时间:2018-01-22 00:56:13

标签: php mysql doctrine-orm

我正在为网站编写一个小型Web应用程序,因此必须访问数据库中的一些现有表。那些我不会添加或改变的东西。

我还会创建一些自己的新表,我会在那里写东西。

现在问题:

  • 当我运行updateSchema时,它会删除我没有专门为其创建实体的数据库中的每个表。那里有30张桌子,我只需要2张桌子!我根本不想碰别人。它不应该删除它们。
  • 在这两个中,我真的只需要3列“id”,“name”和“email”,但是这些表再次像10列我根本不感兴趣,因此没有映射到我的实体对象。更新确实删除了我没有匹配的每一列。同样,它根本不应该触及这些......

我不太确定如何解决这个问题,因此它不会只重写整个数据库。

这是我用来更新架构的setup.php:

<?php

require_once '../inc/config.inc.php';

$em= Inc\Config::getEm();

$schemaTool = new \Doctrine\ORM\Tools\SchemaTool($em);

$metadata = $em->getMetadataFactory()->getAllMetadata();


try {
    $schemaTool->updateSchema($metadata);
} catch (PDOException $e) {
    echo 'WARNING: There was a problem updating the database schema: ';
    echo $e->getMessage() . '<br />';
    if (preg_match("/Unknown database '(.*)'/", $e->getMessage(), $matches)) {
        die(
                sprintf('Create the database %s with the Collation utf8_general_ci', matches[1])
        );
    }
}

echo 'Setup successfully completed!';

1 个答案:

答案 0 :(得分:0)

根据Doctrine的docs(1):

void updateSchema(array $classes, boolean $saveMode = false)
  

通过比较指定类的数据库架构   ClassMetadata实例到当前的数据库架构即   检查过。

     

布尔值$ saveMode如果为TRUE,则仅执行部分更新,而不会删除计划删除的资产。

为避免资产掉落到给定的元数据之外,您应该将true作为saveMode参数值传递。

(1)https://www.doctrine-project.org/api/orm/2.6/Doctrine/ORM/Tools/SchemaTool.html#method_updateSchema