我有一个循环遍历一些导入的Product数据,并使用Doctrine2将其持久保存到数据库。
对于每个产品,我检查产品ID是否已经存在。如果是这样,请更新它。如果没有,请创建并坚持下去。
我对相关实体也这样做,这是我遇到问题的地方,例如每个产品都与制造商有关。 在每个循环中,我将检查是否存在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);
}
答案 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.