我目前正在玩Symfony2,到目前为止非常喜欢它。虽然出现了一个问题,但我想知道最佳做法是什么。
如果我想坚持一个实体,我必须这样:
<?php
$myEntity = new Entity();
$myEntity->setSomeData('just an example');
$em = $this->get('doctrine')->getEntityManager();
$em->persist($myEntity);
$em->flush();
这似乎是一大堆代码要一遍又一遍地完成。我更喜欢的是这样的:
<?php
$myEntity = new Entity();
$myEntity->setSomeData('just an example');
$myEntity->persist();
但是,基于我如何获得实体经理,这似乎远非最佳实践。那我该怎么办?关于你如何处理它的任何提示?
答案 0 :(得分:11)
这是保持关注点正确分离的标准方法。实体不应该知道持久层。
你可以轻松做的是在你的控制器类上添加一个快捷方式persistAndFlush方法,如果你真的有那么多代码可以创建并保留新的实体。
答案 1 :(得分:6)
另外,不要忘记flush方法实际上是在更新数据库上的更改。这意味着如果您需要持久保存多个实体,最好在每次持续操作结束时执行一次刷新。
假设您有三个实体:$entity1
,$entity2
和$entity3
。那么这段代码不是最优的:
$em->persist($entity1);
$em->flush();
$em->persist($entity2);
$em->flush();
$em->persist($entity3);
$em->flush();
此代码的效果会更好,因为它只会同步您的数据库一次:
$em->persist($entity1);
$em->persist($entity2);
$em->persist($entity3);
$em->flush();
因此,应谨慎使用控制器中的快捷方式,例如persistAndFlush
,因为当您需要保留多个实体时效率不高。这在Doctrine2文档中指出here(页面3/4)。这里的文字来自官方2.0文档:
每次更改实体或每次调用persist / remove / merge /后都不要调用flush。这是一种反模式,会不必要地降低应用程序的性能。相反,形成对您的对象进行操作的工作单元,并在完成后调用flush。在提供单个HTTP请求时,通常不需要调用刷新次数超过0-2次。
此致 马特