Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony2原则从控制器内部创建表和数据_Symfony - Fatal编程技术网

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

Symfony2原则从控制器内部创建表和数据,symfony,Symfony,我想在第一次在浏览器中打开symfony2项目时为该项目创建必要的表和数据 我有一个登录,这是主要的入口点。在这个操作中,我想做一些类似于创建表的事情,如果不存在“blub”。。等等 你知道我的意思吗?这可能吗?如何实现?我在网上找不到关于他的任何东西 我试过了 $em = $this->getDoctrine()->getManager(); $query = $em->createQuery( "CREATE TABLE IF NOT EXIST

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

我有一个登录,这是主要的入口点。在这个操作中,我想做一些类似于创建表的事情,如果不存在“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();
但它告诉我错误:预期选择、更新或删除,得到“创建”。 所以我不可能像以前那样尝试


如果您能帮助我,我将非常高兴:)

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

你应该考虑一些类似的事情:

  • 一种安装机制,可导致:
    • 数据库模式创建
    • 夹具加载
为了快速解释,SF2中有一些控制台命令,允许您根据实体创建/更改数据模型。因此,您不应该自己“创建”或“更新”模式,而是使用为此而设计的命令,即:

app/console doctrine:schema:update --force
--force
选项用于强制命令更改表格。请注意,删除列(实体属性)将不会保存它们的数据,这就是为什么在生产环境中不建议这样做的原因之一

请看一看

然后,加载“基本”数据称为“夹具加载”。你可以看看,以帮助自己使用它

编辑: 既然已经意识到这一点,那么应该考虑从控制器中调用命令(Schema:Update和Fix:Load)。

然而,关于这个问题的文献并不多。您可以从一个控制器上观察它的工作情况,因为您可以从它获取应用程序,然后调用文档中的命令


希望这有帮助:)

如果已经创建了一个实体(例如,“AppBundle:Log”),那么它可能类似于(快速且脏的)


如果表“log_1”不存在,这将创建该表。

谢谢您的提示,但我已经知道了。我想做的是创建一个独立的应用程序,一个不是程序员但拥有ftp权限的人可以上传symfony项目,在浏览器中调用它,它将“自行安装”。哇,太棒了!我不知道那是可能的!你有点像一个symfony专家,不是吗?:)
    $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));
    }