2012-07-28 118 views
0

我一直在做直接的MySQL很长一段时间,现在正在尝试以ORM的方式做事情。我有一个用户创建设计的网站。设计表有一个映射到User.id的字段“userId”。设计实体有一个值,$用户,定义实体之间的关系:用doctrine2中的映射更新实体

/** 
* @ORM\ManyToOne(targetEntity="User") 
* @ORM\JoinColumn(name="userId", referencedColumnName="id") 
*/ 
private $user; 

这是不错的,我现在可以加载一个设计实体,并以$设计 - >用户>姓氏获取用户的姓氏。

现在让我们说一个用户创建一个新的设计。我喜欢保存实体:

$design = new Design(); 
$design->setTitle($_POST['title']); 
$design->setUserId($_POST['userId']); 
$em = $this->getDoctrine()->getEntityManager(); 
$em->persist($design); 
$em->flush(); 

当我做到这一点,它没有这样的消息,用户id,这使得没有空,为空。我想我可能会错误地传递给它,但是当我删除它工作正常设计实体$用户,所以我认为这是预期中的用户对象传递,以及像:

$design->user = new User($userId) 

我不我真的想添加一个数据库调用来获取整个用户,当我已经知道所需的ID时。处理这个最简单的方法是什么?

+0

在持久化Design实体的控制器操作中 - 您是否已经获取用户e。 G。进行访问/权限检查等?另外,如果你做$ design-> user = new User($ userId);你可能会从你的数据库中获得另一个持久保存的用户或重复的输入错误。 – Max 2012-07-28 20:36:54

+0

这是一个很好的问题。设计通过API提交(它们不是图像,但规格),因此我使用安全令牌来确定用户标识。 API只是获取令牌及其设计规范,而令牌不包含整个用户对象。这是关于新设计,因为你是对的,当他们编辑现有的设计时,控制器会提供包括$ user在内的整个对象。 – SkippyFlipjack 2012-07-28 21:59:22

回答

0

希望我已经了解你的db设计,你是一个用户表和设计表。每个用户可能有很多设计。对?然后在你的设计实体中有一个现场用户及其设置者(public setUser())和一个获取者方法(public getUser())。在设计实体的持久性期间,它总是期望ORM中的User字段(不是id)的用户对象。在ORM中,用户和设计之间的foreginkey关系通过对象进行映射。

所以在你的情况下,坚持设计实体 1.从userId制作用户对象。

$em = $this->getDoctrine()->getEntityManager();//make your entity manager 
    $userobj=$em->getRepository('yourBundle:User')->find($userId); 
    $design = new Design(); 
    $design->setTitle($_POST['title']); 
    $design->setUser($userobj); 
    $em->persist($design); 
    $em->flush(); 

一Imoprtant件事确保在您的设计单位不具有该领域用户id,而不是用户。如果您需要删除userid的getter和setter方法并编辑您的yml文件或添加注释(如果您使用注释)