在刷新实体管理器之前检查 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();