Symfony3 foreach导致本地服务器崩溃

时间:2017-04-29 15:48:20

标签: php symfony foreach doctrine-orm doctrine

我在一个数据库中有两个表,它们被清空并经常更换。每个表都有超过65,000行。我想从第一个表中选择两个字段( LnsPriceUpdates ),然后获取这些值并进行比较并将它们插入到第二个表( LnsCatalog )中,并希望这样做数据库中的所有65,000个项目。

(注意:我想从本地主机执行所有这些操作)

这是我目前使用的代码:

public function testbananaAction()
{

    $em = $this->getDoctrine()->getManager();
    $query = $em
        ->createQuery(
            'SELECT l.partnumber, l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL'
        )
        ->getResult();


    foreach ($query as $row){
        $partNo = $row['partnumber'];
        $part = $em->getRepository('AppBundle:Lnscatalog')
            ->findOneBy(['partnoid' => $partNo]);
        $dealerCost = $row['level1Net'];
        if(isset($dealerCost) && isset($part)){
            $partCheck = $part->getDealerCost();
            if(!isset($partCheck)){
                $part->setDealerCost($dealerCost);
                $em->flush();
            }
        } else {
            continue;
        }

    }
    return new Response('yay');

}

任何完成此任务而不崩溃的想法都会有所帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用单个Sql Update实现:

update Lnscatalog c 
set c.dealerCost = (SELECT l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL and l.partnumber=c.partnoid)
where c.dealerCost is null
and exists (SELECT l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL and l.partnumber=c.partnoid)

您可以加快此查询,在上表中添加一些索引,例如:

ALTER TABLE LnsPriceUpdates 
 ADD INDEX LnsPriceUpdates_IDX_1 (level1Net, partnumber) ;

ALTER TABLE LnsPriceUpdates 
 ADD INDEX LnsPriceUpdates_IDX_2 (partnumber) ;

ALTER TABLE Lnscatalog 
 ADD INDEX Lnscatalog_IDX_2 (dealerCost) ;

可以找到有关优化SQL查询的一些参考hereherehere

希望这个帮助