2015-10-05 55 views
0

我正在使用Doctrine生成和更新我的數據庫根據我的實體。此外,我在我的表上使用MyISAM引擎。要做到這一點我已經加入我的註釋,如:生成數據庫MyISAM Doctrine 2

/** (...) @ORM\Table(name="user",options={"engine":"MyISAM", "charset"="utf8"}) */ 

這個表格是正常產生的MyISAM數據,但是當我嘗試更新他們現在學說試圖生成FKS。然後,我得到了:

General error: 1215 Cannot add foreign key constraint 

我知道MyISAM不支持FKs,有沒有辦法告訴主義跳過創建FKs?

我同時使用ORM:架構工具:更新(在DEV)和遷移(正式版)。另外我正在使用zf2。

回答

1

基於this thread我帶來了一個解決方案。

我向EM添加了一個事件監聽器。

$em->getEventManager()->addEventSubscriber(new DropForeignKeysListener()); 

此事件放棄所有FKS從註釋生成的模式,如:

use Doctrine\Common\EventSubscriber; 
use Doctrine\ORM\Tools\ToolEvents; 
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs; 

class DropForeignKeysListener implements EventSubscriber 
{ 
    public function postGenerateSchema(GenerateSchemaEventArgs $args) { 
     $schema = $args->getSchema(); 

     $table_names = $schema->getTableNames(); 
     foreach ($table_names as $table_name) { 
      $table = $schema->getTable($table_name); 
      $fks = $table->getForeignKeys(); 

      foreach ($fks as $fk => $obj) { 
       $table->removeForeignKey($fk); 
      } 
     } 
    } 

    public function getSubscribedEvents() { 
     return array(ToolEvents::postGenerateSchema); 
    } 

} 
-1

MyISAM存儲引擎不支持行級鎖定,外鍵,它甚至不支持事務。查看this question以獲得更詳細的答案。

如果您沒有任何具體的&有效理由使用MyISAM,我強烈建議使用InnoDB代替。

您可能還想讀這個comparison between InnoDB and MyISAM

+0

我知道,它不支持FKS(我也許不讓它在這個問題清楚)當我嘗試更新數據庫時,我只想避免創建。否則,我必須轉儲SQL並手動刪除創建語句。 此外,我可以把它,但現在即使我這樣做,我會保持好奇我應該如何避免它。對於示例,現在我正在考慮使用像這樣的事件訂閱者:[告訴模式工具忽略實體](https://groups.google.com/forum/#!topic/doctrine-user/rwWXZ7faPsA)。這更接近我正在尋找的答案。 – diegopso