2

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

对于每个产品,我都会检查该 productID 是否已经存在。如果是这样,请更新它。如果没有,请创建并保留它。

我对关联实体做同样的事情,这是我遇到问题的地方,例如每个产品都与制造商相关。在每个循环中,我将检查是否存在制造商 ID,如果不存在,则创建/保留它。如果我在一次迭代中创建 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);
        }
4

2 回答 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");
于 2013-09-17T14:19:24.850 回答
-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.
于 2013-09-17T13:53:13.627 回答