在 symfony 3 中插入​​多行很慢

insert multiple rows is slow in symfony 3

我正在 symfony 中插入多行。我的代码插入非常缓慢。有没有人有任何想法对我没有帮助!谢谢!

                    $manager = $this->getContainer()->get('doctrine')->getEntityManager();
                    // data : object
                    foreach ($data as $value) {
                        $entitty = $stkModel->getRepository()->findOneBy(['phone' => $value->getPhone()]);
                        if ($entity) {
                            $stk = $stkModel->getEntity();
                            $stk->setName('mina');
                            $stk->setStatus(1);
                            $manager->persist($stk);
                            $manager->flush();
                        }
                        if ($stk) {
                            $entitty = $titleModel->getRepository()->findOneBy(['stkId' => $stk->getId()]);
                            $title = $titleModel->getEntity();
                            $title->setName('dev');
                            $title->setOrder(2);
                            $manager->persist($title);
                            $manager->flush();
                        }
                        // Here I take $title->getId();
                    }

首先,您只需要在使用 new 创建的实体上调用 persist。但这不会给你速度性能。

flush 每次使用它都会减慢应用程序的速度,因为这里的查询将被发送到数据库。要加快您的应用程序,您必须尽量减少 flush 的使用。在您的情况下,只需在更新实体后执行一个 flush

$manager = $this->getContainer()->get('doctrine')->getEntityManager();
// data : object
foreach ($data as $value) {
    $entitty = $stkModel->getRepository()->findOneBy(['phone' => $value->getPhone()]);
    if ($entity) {
        $stk = $stkModel->getEntity();
        $stk->setName('mina');
        $stk->setStatus(1);
        // $manager->persist($stk); <-- Don't need persist here because your object is coming out from the entity manager
    }
    if ($stk) {
        $entitty = $titleModel->getRepository()->findOneBy(['stkId' => $stk->getId()]);
        $title = $titleModel->getEntity();
        $title->setName('dev');
        $title->setOrder(2);
        // $manager->persist($stk); <-- same as mention above
    }
}

// call flush once at the end
$manager->flush();

在某些情况下,您需要在 foreach 的每个循环中调用 flush。如果您需要查询它,可能会发生这种情况。但在你的情况下,你只是搜索一个 id,它并没有改变。