Exception handling Symfony3:带异常处理的条令批处理

Exception handling Symfony3:带异常处理的条令批处理,exception-handling,doctrine,symfony,batch-processing,flush,Exception Handling,Doctrine,Symfony,Batch Processing,Flush,我需要使用Symfony3命令从Excel文件插入多个用户。我已经阅读了以下关于批处理的文章: 我一直在想,当查询失败时,是否有办法不停止刷新过程(例如,对于NOTNULL列)。实际上,我希望在执行persist和let原则继续插入之前,能够不检查所有数据,即使一个查询在20个查询中失败 谢谢你的帮助 亲切问候,此模板可能会帮助您进一步 $batchSize = 20; $currentSize = 0; $data = [ .... ]; foreach ($data as $item) {

我需要使用Symfony3命令从Excel文件插入多个用户。我已经阅读了以下关于批处理的文章:

我一直在想,当查询失败时,是否有办法不停止刷新过程(例如,对于NOTNULL列)。实际上,我希望在执行persist和let原则继续插入之前,能够不检查所有数据,即使一个查询在20个查询中失败

谢谢你的帮助


亲切问候,

此模板可能会帮助您进一步

$batchSize = 20;
$currentSize = 0;

$data = [ .... ];
foreach ($data as $item) {
    $entity = new Entity();
    $entity->setProperty($item['property']);

    try {
        $currentSize++;
        $em->persist($entity);

        if ($batchSize% $currentSize === 0) {
            $em->flush();
            $em->clear();
        }
    } catch (\Doctrine\ORM\ORMException $e) {
        $currentSize--;
    }
}

$em->flush();
$em->clear();

基本上没有。违反约束基本上意味着您不能再使用实体管理器。已经有人谈论要改变这一点,但还没有。因此,遇到异常情况时,您唯一的选择就是创建一个全新的实体管理器对象。ORM并不是真正为批处理而设置的。另一种方法是使用条令数据库抽象层(DBAL)。所以我假设我的选择是要么在刷新之前验证所有内容,要么对每个实体使用一次刷新,并在每次刷新失败时实例化一个新的实体管理器。对吗?如果我有2000个条目要存储在一行中,那么对每个实体使用刷新会有什么错误?感谢您在每个实体之后刷新没有问题,尽管您可能会遇到性能问题。但2K实体应该可以。2万英镑也许没那么多。是的,在尝试坚持之前进行验证可能是值得的。谢谢。但这似乎不能告诉我哪个实体失败了。另外,如果一个实体未能刷新,那么整个批处理都会失败,对吗?正如我所说,它只是一个模板。如果您想知道导致失败的实体,可以添加$failedEntities=[];在循环上方添加$failedEntities[]=$entity;在捕捉器内。添加$container->get('doctrine')->resetManager()$em=$container->get('doctrine')->getManager()在捕获失败后重新创建一个全新的$em。