我使用Doctrine2 ORM将数据导入新的Symfony2项目。
所有新记录都应具有自动生成的主键。但是,对于我的导入,我想保留现有的主键。
我使用它作为我的实体配置:
type: entity
id:
id:
type: integer
generator: { strategy: AUTO }
我还在我的实体类中为id字段创建了一个setter。
但是,当我持续并将此实体刷新到数据库时,我不会保留手动设置的密钥。
对此最好的解决方法或解决方案是什么?
答案 0 :(得分:3)
您可能已经考虑过这一点,但我的方法是将导入器的生成器策略设置为“none”,以便您可以手动导入客户端代码中的现有ID。然后,一旦导入完成,将生成器策略更改回“auto”以让RDBMS从那里接管。条件可以确定是否调用了id setter。祝你好运 - 让我们知道你最终决定使用什么。
答案 1 :(得分:3)
以下答案不是我的,而是OP,这是在问题中发布的。我把它移到了这个社区wiki的答案中。
我存储了对Connection对象的引用,并使用它来手动插入行和更新关系。这完全避免了持久性和身份生成器。也可以使用Connection将所有这些工作包装在事务中。
执行insert语句后,您可以更新关系。
这是一个很好的解决方案,因为它避免了在实时服务器上交换配置时可能遇到的任何潜在问题。
在你的初始化函数中:
// 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);
}