6

我目前正在玩 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();

但是,根据我必须如何获得实体经理,这似乎远非最佳实践。那我该怎么办?关于你如何处理它的任何提示?

4

2 回答 2

11

This is the standard way to do it to keep a proper separation of concerns. Entities should not know about the persistence layer.

What you can easily do is add a shortcut persistAndFlush method on your controller class though, if you really have that many code that creates and persists new entities.

于 2011-05-30T14:22:02.083 回答
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 文档(页面的 3/4)中有所说明这里的文本取自官方 2.0 文档:

不要在每次更改实体或每次调用persist/remove/merge/...之后调用flush。这是一种反模式,会不必要地降低应用程序的性能。相反,形成对您的对象进行操作的工作单元,并在完成后调用刷新。在服务单个 HTTP 请求时,通常不需要调用刷新超过 0-2 次。

问候, 马特

于 2011-06-01T16:14:23.560 回答