1

我正在尝试通过 Doctrine 创建多个记录,我遇到了一个奇怪的问题,它将成功创建第一条记录,但没有其他记录。假设我有以下内容,其中 Record 是 Doctrine 实体,record_id 是主键:

 $entityManager->getConnection()->beginTransaction();

 foreach($recordsToCreate as $data)
 {
   $record = new Record();
   $record->field1 = $data['field1'];
   $record->field2 = $data['field2'];

   $entityManager->persist($record);
   $entityManager->flush();
 }

 $entityManager->getConnection()->commit();

如果我有三条记录,第一条将被正确创建,而其他两条则不会。不会引发错误或异常,但不会在数据库中创建记录。如果我在刷新后输出每条记录,则所有字段都设置正确,但在第一条记录后主键为空。我认为这是一个 Doctrine 故障,但我想在提交错误报告之前确认一下。

谢谢。

4

1 回答 1

0

弄清楚了 - 答案不是如上所述将 flush() 放在循环之外。解决方案是在提交事务后使用 detach()。所以:

 foreach($recordsToCreate as $data)
 {
   $entityManager->getConnection()->beginTransaction();
   $record = new Record();
   $record->field1 = $data['field1'];
   $record->field2 = $data['field2'];

   $entityManager->persist($record);
   $entityManager->flush();

   $entityManager->getConnection()->commit();
   $entityManager->detach($record);
 }

这对我有用。问题在于(我认为)实体管理器无法区分第一条记录和其余记录之间的区别,因此分离确保它在创建时始终具有新记录。此外,事务现在处于循环中,因为我实际上是在我的实际代码中使用此记录创建/修改其他记录,因此将它放在循环中对我的设置更准确。

所以简而言之,在提交后对新记录调用 detach ,这对我有好处。

于 2013-07-02T14:56:10.273 回答