主义结合JoinTable插入
我有两个的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();
读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();
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();
我知道这种方法并已在其他部分使用它。 但我不插入多张代金券或支持。 Join Table插入是问题。 – develth
您可以使用“INSERT INTO ... SELECT FROM ...”的本地查询将行填充到连接表中。 –