我正在尝试通过 Doctrine 创建多个记录,但遇到了一个奇怪的问题,它将成功创建第一个记录,但不会创建其他记录。假设我有以下内容,其中 Record 是 Doctrine Entity,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 故障,但我想在提交错误报告之前确定一下。
谢谢。
最佳答案
弄清楚了 - 答案并不是如上所述将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);
}
现在这对我有用。问题是,不知何故(我认为)实体管理器无法区分第一个记录和其余记录之间的区别,因此分离确保它在创建时始终有一个新记录。另外,事务现在处于循环中,因为我实际上是在实际代码中使用此记录创建/修改其他记录,因此将其放在循环中对我的设置来说更准确。
所以简而言之,在提交后对新记录调用分离,这对我来说都是有好处的。
关于php - Doctrine 2 创建多个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17409046/