2011-11-07 69 views
7

我正在使用Doctrine2 ORM將數據導入到新的Symfony2項目中。如何在Doctrine2中手動設置主鍵

所有新記錄都應該有一個自動生成的主鍵。但是,對於我的導入,我想保留現有的主鍵。

我用這作爲我的實體配置:

type: entity 
    id: 
    id: 
     type: integer 
     generator: { strategy: AUTO } 

我也曾在我的實體類創建了id字段二傳手。

但是,當我堅持並將此實體刷新到數據庫時,手動設置的密鑰不會保留。

什麼是最好的解決方法或解決方案?

回答

3

以下答案不是我的,而是OP的,它是在問題中發佈的。我已將其移入此社區wiki答案。


我存儲到連接對象的引用和用於該手動插入行和更新的關係。這完全避免了持久性和身份生成器。也可以使用Connection將所有這些工作包裝在一個事務中。

一旦你執行了插入語句,你可以更新關係。

這是一個很好的解決方案,因爲它避免了在實時服務器上交換配置時可能遇到的任何潛在問題。

在您的初始化函數:

// Get the Connection 
    $this->connection = $this->getContainer()->get('doctrine')->getEntityManager()->getConnection(); 

在您的主體:

// Loop over my array of old data adding records 
    $this->connection->beginTransaction(); 

    foreach(array_slice($records, 1) as $record) 
    { 
    $this->addRecord($records[0], $record); 
    } 

    try 
    { 
    $this->connection->commit(); 
    } 
    catch(Exception $e) 
    { 
    $output->writeln($e->getMessage()); 
    $this->connection->rollBack(); 

    exit(1); 
    } 

創建此功能:

// Add a record to the database using Connection 
    protected function addRecord($columns, $oldRecord) 
    { 
    // Insert data into Record table 
    $record = array(); 
    foreach($columns as $key => $column) 
    { 
     $record[$column] = $oldRecord[$key]; 
    } 
    $record['id'] = $record['rkey']; 
    // Insert the data 
    $this->connection->insert('Record', $record); 
    } 
3

您可能已經考慮過這一點,但我的方法是將生成器策略設置爲「無」以便導入,以便您可以在客戶端代碼中手動導入現有ID。然後,一旦導入完成,將生成器策略更改回「自動」,讓RDBMS從那裏接管。條件可以確定是否調用了id設置器。祝你好運 - 讓我們知道你最終決定使用什麼。

+0

感謝這個提示。我一直在這樣做,但我不確定它是否理想。我想我最終可能會執行原始DQL查詢。 –

+0

請參閱上面的解決方案。我使用Connection對象作爲一個愉快的PDO接口。 –

+0

如何(暫時)禁用ID生成器策略:http://www.ens.ro/2012/07/03/symfony2-doctrine-force-entity-id-on-persist/ – aimfeld