如何用Doctrine保存多条记录并获取每条记录的ID数组
修改函数返回所有保存记录的ID数组
没问题,这个修改很容易实现,核心思路就是在循环中保存每个创建的实体引用,等flush完成后再提取所有实体的ID。以下是修改后的完整代码:
public function saveAdditionalDataForRecord($header, $data, $record) { $em = $this->getEntityManager(); $savedEntities = []; // 存储所有新建的实体实例 foreach ($header as $key => $value) { $clientRecordAdditionalData = new ClientRecordAdditionalData(); $clientRecordAdditionalData->setName($value); $clientRecordAdditionalData->setValue($data[$key]); $clientRecordAdditionalData->setRecord($record); $em->persist($clientRecordAdditionalData); $savedEntities[] = $clientRecordAdditionalData; // 将当前实体加入数组 } $em->flush(); // 执行数据库写入,此时所有实体都会获得ID // 提取所有实体的ID组成数组 $savedIds = array_map(function($entity) { return $entity->getId(); }, $savedEntities); return $savedIds; }
关键修改点说明:
- 新增了
$savedEntities数组,用来保留循环中创建的每一个ClientRecordAdditionalData对象,避免像原来那样每次循环覆盖掉之前的实体引用。 - 执行
flush()之后,Doctrine会完成所有新实体的数据库插入操作,并且会为自增类型的ID字段赋值,此时调用getId()就能获取到有效的记录ID了。 - 如果觉得
array_map不够直观,也可以用普通的foreach循环来提取ID:$savedIds = []; foreach ($savedEntities as $entity) { $savedIds[] = $entity->getId(); }
这样修改后,函数就会返回所有成功保存的记录ID组成的数组了。
内容的提问来源于stack exchange,提问作者Krzysztof Michalski
相关产品推荐
相关产品推荐

