在Doctrine2中使用映射更新实体

时间:2012-07-28 20:21:19

标签: symfony doctrine-orm

我已经做了很长时间的直接MySQL,现在正试图以ORM的方式做事。我有一个用户创建设计的网站。 Design表有一个映射到User.id的字段“userId”。 Design实体的值为$ user,用于定义实体之间的关系:

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

很好,我现在可以加载一个Design实体,并使用$ design-> user-> lastname获取用户的姓氏。

现在让我们假设用户创建了一个新设计。我将实体保存为:

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

当我这样做时,失败的消息是userId(不允许空值)为空。我以为我可能会错误地传递它,但是当我从Design实体中删除$ user时它工作正常,所以我认为它也期望传递用户对象,例如:

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

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

1 个答案:

答案 0 :(得分:0)

希望我已经了解了您的用户表和设计表的数据库设计。每个用户可能有许多设计。对?然后在您的设计实体中有一个字段用户及其setter(public setUser())方法和一个getter方法(public getUser())。在设计实体的持久性期间,它始终期望ORM中的用户对象(不是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();

一个重要的事情确保您的设计实体中没有字段userId而不是user。如果您需要删除userid的getter和setter方法,还要编辑yml文件或anotation(如果使用注释)