我正在尝试通过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();
如果我有三条记录,第一条记录将正确创建,而不是其他两条记录。不会抛出任何错误或异常,但不会在数据库中创建记录。如果我在刷新后输出每个记录,则所有字段都设置正确但主键在第一个记录后为空。我认为这是一个学说故障,但我想在提交错误报告之前确定。
感谢。
答案 0 :(得分: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);
}
现在对我有用。问题是,不知何故(我认为)实体经理无法区分第一个记录和其他记录之间的区别,因此分离确保它在创建时始终有新记录。此外,事务现在处于循环中,因为我实际上是在实际代码中使用这个记录创建/修改其他记录,因此将它放在循环中对我的设置更准确。
所以简而言之,在提交后调用新记录中的分离,这对我都有好处。