我想在浏览器中第一次打开项目时为我的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'。 因此,我尝试的方式对我来说不可能接缝。
如果你可以帮助我会很高兴:)
答案 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'如果它不存在。