5

当你要插入一个Entity你这样做:你如何使用Doctrine 2中的实体关系?

$user = new User(); 
$user->setEmail('[email protected]'); 

$em->persist($user); 
$em->flush(); 

但是,如果我想创建可以具有一个用户的文章是什么;

目前,我需要做的:

$user = $em->getRepository('User')->find($id); 
$article->setUser($user); 

这是因为关系的,原则2请求的用户实体。

但是,我不能“模拟”的用户对象,因为我不希望的ID可以手动设置,所以我不能做信息:

$user = new User(); 
$user->setId(45); 

我错了这个行为,你好吗?

加载用户实体只是为了设置关系,即使是使用高速缓存(这不总是一个选项),尤其是对于更新,可能是性能问题。

回答

10

如果你没有一个管理用户实体得心应手,你要的是一个reference proxy,其中EM会很乐意给你:

<?php 
$article = new Entity\Article(); 
$article->setTitle('Reference Proxies Rule'); 
$article->setBody('...'); 
$article->setUser($em->getReference('Entity\User',45)); 
$em->persist($article); 
$em->flush(); 
+0

真棒,谢谢(再次!) – JohnT 2011-05-16 09:04:27

+0

洛尔蒂姆,再次这个难以捉摸的'getReference()'功能保存一天。顺便说一句 - 在代码'$ em()'中输入错字。 – Cobby 2011-05-16 13:36:35

+0

@Cobby - 它看起来像#1清晰记录,但经常被忽视的功能。毕竟,我们可能已经找到了一个体面的使用案例。感谢typofix。 – timdev 2011-05-16 17:27:33

-1

为什么您的文章需要用户在第一个地方有一个ID?你应该能够在没有EntityManager的情况下对你的实体进行单元测试,如果你不能,那么你可能可能做错了什么。然后当你做功能单元测试时,它就是simple as this

我建议你看看Zend Casts的Unit Testing Doctrine 2 Entities

+1

嗯,这不是问题,无论是现有用户或不是,如果我想用现有的用户更新我的文章,我需要先取得用户实体,否则如果我的用户没有ID,Doctrine2如何知道用户?我的文章绝对不需要让用户有效。我只是说我不能让一个实体设置自己的ID,因此模拟一个用户对象。 – JohnT 2011-05-15 23:01:03

+0

顺便说一句,谢谢你的链接,但我已经知道这个截屏,但我没有发现真正有用的实体单元测试。 – JohnT 2011-05-15 23:05:14

相关问题