0

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

我有一个 loginAction,它是主要的入口点。在这个动作中,我想做一些类似 CREATE TABLE IF 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”。所以对我来说,我尝试的方式似乎是不可能的。

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

4

2 回答 2

2

如果此类项目用于生产目的,则强烈建议不要使用从控制器(或在项目部署后的任何时间从控制台)加载表创建/固定装置。

您应该考虑一些事情,例如:

  • 一种安装机制,导致:
    • 数据库模式创建
    • 夹具加载

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

app/console doctrine:schema:update --force

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

请查看有关该主题的官方 SF2 文档

然后,加载您的“基础”数据称为“夹具加载”。您也可以查看其官方文档以帮助自己使用它。

编辑:正如您已经知道这一切,您应该考虑从您的控制器调用这两个命令(schema:update 和 fixtures:load)。

然而,关于这个主题的文档并不多。您可以在应该从控制器工作的文档中观看此示例,因为您可以从中获取应用程序,然后调用文档中的命令。

希望这可以帮助 :)

于 2013-11-05T08:59:53.520 回答
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”不存在,这将创建它。

于 2017-05-16T19:20:58.763 回答