2013-11-05 31 views
0

我想在瀏覽器中第一次打開項目時爲我的symfony2項目創建必要的表和數據。Symfony2 Doctrine從控制器內部創建表和數據

我有一個loginAction這是主要的入口點。在這個動作中,我想做一些類似CREATE TABLE如果不存在`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,得到了 '創建'。 所以它接縫不可能以我的方式嘗試。

會很高興,如果你能幫助我:)

回答

2

如果這種項目是生產的目的,這是強烈建議不要使用表的創建/燈具從控制器加載(或從控制檯在項目以後的任何時間將被部署)。

你應該考慮sereval的東西,如:

  • 數據庫模式創建
  • 燈具加載

只是爲了快速解釋:導致

  • 的安裝機制,你在SF2中有一些控制檯命令,允許你創建/改變y我們的數據模型根據您的實體。因此,你不應該「創造」或「更新」自己的模式,而是使用專爲這個命令,又名:

    app/console doctrine:schema:update --force 
    

    --force選項是在這裏強制命令來改變你的表。請注意,刪除列(實體屬性)不會保存其數據,這是在生產環境中極不推薦的原因之一。請致電the official SF2 documentation on the subject

    然後,加載您的「基礎」數據稱爲「夾具加載」。你可以看看its official documentation too來幫助你自己使用它。因爲你已經意識到了所有這些,你應該考慮從你的控制器調用兩個命令(schema:update和fixtures:load)。

    但是,這方面的文檔並不多。您可以觀看this example in the doc,這些應該可以從控制器上運行,因爲您可以從中獲取應用程序,然後像文檔中那樣調用命令。

    希望這有助於:)

+0

感謝提示,但我知道已經。我想要做的是創建一個獨立的應用程序,一個不是程序員但擁有ftp權限的人可以上傳symfony項目,在瀏覽器中調用它,它將「自行安裝」。 – humpdi

+0

我編輯了我的第一個推薦humpdi! –

+0

太好了!不知道這是可能的! 你是某種symfony pro,是嗎? :) – humpdi

0

有一個已經創建的實體(例如 '的appbundle:日誌'),它可能是這樣的(快速和骯髒)

$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'如果它不存在。

相關問題