我是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/