如何在Doctrine2中手动设置主键

时间:2011-11-07 21:14:39

标签: doctrine-orm symfony

我使用Doctrine2 ORM将数据导入新的Symfony2项目。

所有新记录都应具有自动生成的主键。但是,对于我的导入,我想保留现有的主键。

我使用它作为我的实体配置:

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

我还在我的实体类中为id字段创建了一个setter。

但是,当我持续并将此实体刷新到数据库时,我不会保留手动设置的密钥。

对此最好的解决方法或解决方案是什么?

2 个答案:

答案 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);
  }