2017-05-30 76 views
0

我有两个的entites:主义结合JoinTable插入

Voucher 
Support 

这些实体连接表称为

voucher_support 

当我加1000和现有的支持,以新的凭证,它会调用1000个INSERT查询在voucher_support到我的SQL服务器。有50.000肯定也50.000插入。

我怎样才能实现该原则只是使一个INSERT和提高我的表现?

编辑

我认为大宗insertation是解决不了问题。 这是我更好地理解当前的代码:Doctrine2文档

$voucher = new Voucher(); 
$voucher->setCreatedAt(new \DateTime()); 
$supports = $this->em->getRepository('Support')->getOpen(); 
foreach($supports as $support){ 
    // this generates for each support a INSERT in join table. 
    $voucher->addSupport($support); 
} 
$this->em->persist($voucher); 
$this->em->flush(); 

回答

0

Bulk inserts一部分。它建议每个'批'使用flush()。 你也应该考虑用交易包装它。

<?php 
$batchSize = 20; 
for ($i = 1; $i <= 10000; ++$i) { 
    $user = new CmsUser; 
    $user->setStatus('user'); 
    $user->setUsername('user' . $i); 
    $user->setName('Mr.Smith-' . $i); 
    $em->persist($user); 
    if (($i % $batchSize) === 0) { 
     $em->flush(); 
     $em->clear(); // Detaches all objects from Doctrine! 
    } 
} 
$em->flush(); //Persist objects that did not make up an entire batch 
$em->clear(); 
+0

我知道这种方法并已在其他部分使用它。 但我不插入多张代金券或支持。 Join Table插入是问题。 – develth

+0

您可以使用“INSERT INTO ... SELECT FROM ...”的本地查询将行填充到连接表中。 –

-1

Doctrine2不允许您将多个INSERT语句合并成一条:

有些人似乎很奇怪为什么学说不使用多插入(插入(...)值(.. (...),(...),...

首先,这个语法只支持mysql和更新的postgresql版本。其次,没有简单的方法来获得所有在使用AUTO_INCREMENT或SERIAL和ORM时,这种多插入生成的标识符需要标识符来标识对象的身份管理。最后,插入性能很少是瓶颈ORM的eck。普通插入对于大多数情况来说足够快,如果你真的想要快速批量插入,那么多重插入并不是最好的方式,即Postgres COPY或Mysql LOAD DATA INFILE快几个数量级。

这些是为什么不值得努力实现在ORM中对mysql和postgresql执行多重插入的抽象的原因。通过插入一组量后冲洗你的实体管理器http://www.doctrine-project.org/blog/doctrine2-batch-processing.html

您可以切换到DBAL或诉诸加工小批量数据: 你可以阅读更多关于Doctrine2批处理这里

$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(); 
+0

批量插入不是我的问题的解决方案。 – develth

+0

btw。我知道原始帖子:https://stackoverflow.com/a/18655238/1101500 – develth