Symfony2 Doctrine从控制器内部创建表和数据

时间:2013-11-05 07:50:08

标签: symfony

我想在浏览器中第一次打开项目时为我的symfony2项目创建必要的表和数据。

我有一个loginAction,这是主要的切入点。在这个动作中,我想做一些像CREATE TABLE IF NOT NOT EXISTS`blub` ..等等。

你知道我的意思吗?这可能吗?怎么样?我没有在互联网上发现任何事情。

我试过

    $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery(
      "CREATE TABLE IF NOT EXISTS `role` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
        `role` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `UNIQ_57698A6A57698A6A` (`role`)
      ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

      /*!40000 ALTER TABLE `role` DISABLE KEYS */;
      INSERT INTO `role` (`id`, `name`, `role`) VALUES
        (1, 'admin', 'ROLE_ADMIN'),
        (2, 'station', 'ROLE_STATION');
      /*!40000 ALTER TABLE `role` ENABLE KEYS */"
    );

    $products = $query->getResult();

但它告诉我错误:预期SELECT,UPDATE或DELETE,得到'CREATE'。 因此,我尝试的方式对我来说不可能接缝。

如果你可以帮助我会很高兴:)

2 个答案:

答案 0 :(得分:2)

如果这种项目是出于生产目的,我们强烈建议不要在控制器(或部署项目之后的任何时间)从控制器(或从控制台)加载表创建/装置。

您应该考虑以下事项,例如:

  • 导致以下内容的安装机制:
    • 数据库架构创建
    • 灯具装载

为了快速解释,您在SF2中有一些控制台命令,允许您根据实体创建/更改数据模型。因此,您不应该自己“创建”或“更新”模式,而是使用为此设计的命令,即:

app/console doctrine:schema:update --force

--force选项用于强制命令更改表。请注意,删除列(实体属性)将不会保存其数据,这是在生产环境中高度不推荐它的原因之一。

请查看the official SF2 documentation on the subject

然后,加载“基础”数据称为“夹具加载”。您可以查看its official documentation too以帮助自己使用它。

编辑: 正如您已经意识到这一切,您应该考虑从控制器调用这两个命令(架构:更新和夹具:加载)。

然而,关于这个问题的文档并不多。您可以从控制器中查看应该起作用的this example in the doc,因为您可以从中获取应用程序,然后调用文档中的命令。

希望这会有所帮助:)

答案 1 :(得分:0)

拥有一个已创建的实体(例如,' AppBundle:Log'),它可能类似于(快速和脏)

    $schemaManager = $this->getDoctrine()->getConnection()->getSchemaManager();
    if ($schemaManager->tablesExist(array('log_1')) == true) {
        echo "table exists";
    } else {
        $manager = $this->getDoctrine()->getManager();
        $metadata = $manager->getClassMetadata('AppBundle:Log');
        $metadata->setPrimaryTable(array('name' => 'log_1'));
        $schemaTool = new \Doctrine\ORM\Tools\SchemaTool($manager);
        $schemaTool->createSchema(array($metadata));
    }

这会创建表格' log_1'如果它不存在。