在刷新实体管理器之前检查 for 循环中的重复项
Check for duplicates in for loop before entity manager is flushed
我有一个正在使用 for 循环处理的数据源。数据源有时可能有重复项。我正在遍历数据源并创建 "item" 个实体。我试图避免这些重复项,但我认为由于项目尚未发送到数据库,因此在重复检查期间找不到它们。
这是我的伪 for 循环:
foreach($datasource['data'] as $post){
$dupe = $em->getRepository('AppBundle:Item')->findOneByDatasourceId($post['id']);
if(!$dupe){
//process the item
$item = new Item();
$item->setDatasourceId($post['id']);
$em->persist($item);
}
}
$em->flush();
这确实找到了重复项。
当数据还没有发送到数据库时,如何找到重复项?我的印象是实体管理器会知道尚未推送的数据。
谢谢
EntityManager::find 不检查等待持久化的项目。这些项目存储在一个工作对象单元中,理论上,您可以检查它。但这有点痛苦。正如@Matteo 所建议的,您也可以在每次坚持后刷新,但这会影响性能。
让您拥有本地缓存非常简单:
$datasourceCache = [];
foreach($datasource['data'] as $post){
$postId = $post['id'];
if (!isset($datasourceCache[$postID] (
$datasourceCache[$postID] = true;
$dupe = $em->getRepository('AppBundle:Item')->findOneByDatasourceId($postId);
if(!$dupe){
//process the item
$item = new Item();
$item->setDatasourceId($postId);
$em->persist($item);
}
}
}
$em->flush();
我有一个正在使用 for 循环处理的数据源。数据源有时可能有重复项。我正在遍历数据源并创建 "item" 个实体。我试图避免这些重复项,但我认为由于项目尚未发送到数据库,因此在重复检查期间找不到它们。
这是我的伪 for 循环:
foreach($datasource['data'] as $post){
$dupe = $em->getRepository('AppBundle:Item')->findOneByDatasourceId($post['id']);
if(!$dupe){
//process the item
$item = new Item();
$item->setDatasourceId($post['id']);
$em->persist($item);
}
}
$em->flush();
这确实找到了重复项。
当数据还没有发送到数据库时,如何找到重复项?我的印象是实体管理器会知道尚未推送的数据。
谢谢
EntityManager::find 不检查等待持久化的项目。这些项目存储在一个工作对象单元中,理论上,您可以检查它。但这有点痛苦。正如@Matteo 所建议的,您也可以在每次坚持后刷新,但这会影响性能。
让您拥有本地缓存非常简单:
$datasourceCache = [];
foreach($datasource['data'] as $post){
$postId = $post['id'];
if (!isset($datasourceCache[$postID] (
$datasourceCache[$postID] = true;
$dupe = $em->getRepository('AppBundle:Item')->findOneByDatasourceId($postId);
if(!$dupe){
//process the item
$item = new Item();
$item->setDatasourceId($postId);
$em->persist($item);
}
}
}
$em->flush();