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

时间:2013-09-17 13:12:19

标签: symfony doctrine-orm

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

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

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

我可以通过在每个循环之后执行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 个答案:

答案 0 :(得分: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");

答案 1 :(得分:-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.
相关问题