在Symfony2中访问关联实体的值的最佳实践是什么?

时间:2014-04-16 21:42:23

标签: symfony doctrine-orm

使用Doctrine的实体框架,我们假设您有一个名为$user的实体,该实体与$address实体具有OneToOne关联。城市存储在地址实体中,而不是存储在用户实体中。

我了解您可以像这样访问关联实体的值:

$user_city = &$user->getAddress()->getCity();

参考:http://symfony.com/doc/current/book/doctrine.html#fetching-related-objects

如果您需要在代码中多次访问用户的城市,是否最好将此值分配给变量(如上面有或没有&符号参考)?或者最好每次都通过整个链$user->getAddress()->getCity()调用实体值?

第一次调用后,$user->getAddress()是否存储在$ user实体中,所以从现在开始可以访问它的所有属性而没有任何开销?

标准做法是什么,从长远来看效率最高?

1 个答案:

答案 0 :(得分:2)

如果$address是一个单独的实体,则意味着它有自己的生命周期,无论是否将其保存在单独的变量中,Doctrine都会正确处理它的所有操作。 Doctrine正在使用一种名为Identity Map的设计模式(更多这里:http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html),它保证在您明确clone它之前,它将始终返回相同的对象。从那个链接:

  

在这种情况下,文章可以从实体经理访问两次,   但经过修改。教义2意识到这一点,并且只会永远   无论如何,您都可以访问ID为1234的文章的一个实例   你经常从EntityManager中检索它,甚至无论如何   你正在使用什么样的Query方法(find,Repository Finder或   DQL)。这称为“身份地图”模式,即Doctrine   保留每个实体的地图和每个PHP检索到的ID   请求并不断返回相同的实例。

对于"最佳实践",适用软件设计法。如果你需要的只是地址,只传递地址对象。如果您正在对整个用户进行操作,请传递用户对象。遵循Dependency InjectionLaw of Demeter原则,您就会很好。

此处不需要&运算符,因为PHP中的所有对象都是通过引用传递的。