Symfony / Doctrine中的动态数据库和模式创建

5
我希望将数据库连接存储在静态数据库中。按需创建新数据库,将凭证存储在静态数据库中,然后从现有实体中创建新数据库的模式。我知道如何使用symfony的命令行工具做到这一点。我的目标是使其在服务中运行。我查看了Doctrine文档并尝试让一些东西起作用:
    $conn =$this->getDoctrine()->getConnection()->getSchemaManager()->createDatabase($dbname);
    $isDevMode = true;
    $config = Setup::createAnnotationMetadataConfiguration(array('UiCoreDbBundle/Entity'), $isDevMode);

    $conn = array(
        'driver' => 'pdo_mysql',
        'host' => '127.0.0.1',
        'user' => 'root',
        'dbname' => $dbname
    );
    $em = EntityManager::create($conn,$config);

    $tool = new SchemaTool($em);
    $classes = array(
      $em->getClassMetadata('Product')
      //...
    );

    $tool->createSchema($classes);

我的示例代码并没有像我希望的那样工作。Doctrine 找不到我的实体。有谁能给我一个提示,关于如何正确地实现这样的任务?

1个回答

8
我想到了一个解决方案,希望能为后代留下代码片段:
/**
 * @param  string $dbname
 * @throws \Doctrine\ORM\ORMException
 * @throws \Doctrine\ORM\Tools\ToolsException
 */
public function createDatabase($dbname)
{
    $this->em->getConnection()->getSchemaManager()->createDatabase($dbname);
    $params = $this->em->getConnection()->getParams();
    $conn = array(
        'driver' => $params['driver'],
        'host' => $params['host'],
        'user' => $params['user'],
        'dbname' => $dbname
    );
    $newEm = EntityManager::create($conn,$this->em->getConfiguration(), $this->em->getEventManager());
    $meta = $this->em->getMetadataFactory()->getAllMetadata();

    $tool = new SchemaTool($newEm);
    $tool->createSchema($meta);
}

基本上,我正在复制我的现有默认实体管理器,它知道我的实体并进行一些参数更改。您可以手动添加类,而不是使用getAllMetadata:

$meta = array(
      $newEm->getClassMetadata('Bundlename:Entityclass')   
      //...
    );

如果有人知道更好的方法,请告诉我。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接