我是Doctrine的新手,仍然有些模糊的地方。在这种情况下,我将使用循环和实体管理器在数据库中插入新记录。它工作正常,但我注意到Doctrine按实体进行一个插入查询,这可能变得非常庞大。

使用Doctrine2和Symfony 2.3,我想知道我们如何设置它,这样它将只对其中的所有值进行1次插入查询(当然,我们只讨论1个实体)。

我的意思是改变这一点:

INSERT INTO dummy_table VALUES (x1, y1)
INSERT INTO dummy_table VALUES (x2, y2)

进入
INSERT INTO dummy_table VALUES (x1, y1), (x2, y2)

这是我的代码:
$em = $this->container->get('doctrine')->getManager();

foreach($items as $item){
    $newItem = new Product($item['datas']);
    $em->persist($newItem);
}

$em->flush();

最佳答案

根据this answer,Doctrine2不允许您将多个INSERT语句组合为一个:



您可以在此处阅读有关Doctrine2批处理的更多信息:
http://www.doctrine-project.org/blog/doctrine2-batch-processing.html

您可以切换到DBAL,也可以通过在插入一定数量后刷新实体管理器来小批量处理数据:

$batchSize = 20;

foreach ($items as $i => $item) {
     $product = new Product($item['datas']);

     $em->persist($product);

     // flush everything to the database every 20 inserts
     if (($i % $batchSize) == 0) {
         $em->flush();
         $em->clear();
    }
}

// flush the remaining objects
$em->flush();
$em->clear();

关于php - Doctrine2-一枪多次插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18654530/

10-09 02:52