首页 文章

在同一循环中更新和创建实体

提问于
浏览
2

我有一个循环遍历一些导入的Product数据,并使用Doctrine2将其持久化到数据库 .

对于每个产品,我检查是否已存在该productID . 如果是这样,请更新它 . 如果没有,请创建并坚持下去 .

我对相关实体也这样做,这是我遇到问题的地方,例如每个产品都与制造商有关 . 在每个循环中,我将检查是否存在ManufacturerID,如果不存在则创建/持久化 . 如果我在一次迭代中创建了ManufacturerID = 3,然后又生成了另一个带有ManufacturerID3的产品,那么Doctrine还没有知道它,因为它还没有被刷新 .

我可以通过在每个循环之后执行flush()来解决这个问题,而不是在循环完成时,但是我想知道是否有更好的方法,也许某种方式让Doctrine搜索具有ManufacturerID = 3的对象 . 存储库和新持久化的对象?

在每个循环工作后刷新(),但它似乎不是正确的方法 .

$manufacturer = $this->em
            ->getRepository('AMyBundle:Manufacturer')
            ->findOneByPosId($item->manufacturerID);


        if (!$manufacturer)
        {
            $manufacturer = new Manufacturer();
            $manufacturer->setPosId($item->manufacturerID);
            $this->em->persist($manufacturer);
        }

2 回答

  • 1

    你知道他们说了什么:“早期优化是所有邪恶的根源”D. Knuth

    检查这个简单的优化,如果你需要更好的时间,然后拉起你的袖子然后往下走,否则继续前进 .

    我添加了一个小测试基准,记得用空数据库检查两个变种 .

    $time1 = microtime(true);
    // function start 
    
        if (!$manufacturer)
        {
            $manufacturer = new Manufacturer();
            $manufacturer->setPosId($item->manufacturerID);
            $this->em->persist($manufacturer);
            $this->em->flush(); // only flush when there's a new manufacturer
        }
    
    // end of function
    $time2 = microtime(true);
    $time = $time2 - $time1;
    printr("Time elapsed: $time");
    
  • -2
    Manufacturer m = new Manufacturer();
    m.ManufacturerID = 123;
    Database.Load(m);
    
    m.Name = "abc";
    Database.Store(m);
    
    'much easier than symfony.  Sim.  Phony.  J/k.
    

相关问题