Symfony 使用Doctrine2中的映射更新实体

Symfony 使用Doctrine2中的映射更新实体,symfony,doctrine-orm,Symfony,Doctrine Orm,我已经做了很长一段时间的MySQL,现在正试图用ORM的方式来做事情。我有一个用户创建设计的网站。设计表有一个映射到User.id的字段“userId”。设计实体具有一个值$user,该值定义实体之间的关系: /** * @ORM\ManyToOne(targetEntity="User") * @ORM\JoinColumn(name="userId", referencedColumnName="id") */ private $user; 很好,我现在可以加载一个设计实体,并使用$

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

/**
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(name="userId", referencedColumnName="id")
 */
private $user;
很好,我现在可以加载一个设计实体,并使用$Design->user->lastname获取用户的姓氏

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

$design = new Design(); 
$design->setTitle($_POST['title']); 
$design->setUserId($_POST['userId']); 
$em = $this->getDoctrine()->getEntityManager(); 
$em->persist($design); 
$em->flush();
当我这样做时,它会失败,并显示一条消息,即userId(不允许为null)为null。我想我可能传递不正确,但当我从设计实体中删除$user时,它工作正常,因此我认为它也希望传递一个user对象,如:

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

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

希望我已经了解了您的数据库设计,您可以创建一个用户表和设计表。每个用户可能有许多设计。正确的?然后在您的设计实体中有一个字段用户及其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(如果使用注释)

以持久化设计实体–您还没有获取用户e。G进行访问/权限检查等?另外,如果您执行$design->user=newuser($userId);您可能从数据库中得到另一个用户或重复输入错误。这是一个好问题。设计是通过API提交的(它们不是图像,而是规范),所以我使用安全令牌来确定用户ID。API只获取令牌和它们的设计规范,而令牌不包含整个用户对象。这只是关于新的设计,因为你是对的,当他们编辑现有的设计时,控制器会显示整个对象,包括$user。