使用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实体中,所以从现在开始可以访问它的所有属性而没有任何开销?
标准做法是什么,从长远来看效率最高?
答案 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 Injection
和Law of Demeter
原则,您就会很好。
此处不需要&
运算符,因为PHP中的所有对象都是通过引用传递的。