0

我一直在做直接的 MySQL 很长一段时间,现在我正在尝试以 ORM 的方式做事。我有一个用户创建设计的网站。Design 表有一个映射到 User.id 的字段“userId”。Design 实体有一个值 $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 为空的消息。我以为我可能错误地传递了它,但是当我从 Design 实体中删除 $user 时它工作正常,所以我认为它也期望传递一个用户对象,例如:

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

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

4

1 回答 1

0

希望我已经了解您的数据库设计,即您是用户表和设计表。每个用户可能有许多设计。正确的?然后在您的设计实体中有一个字段用户及其 setter( public setUser()) 方法和一个 getter 方法( public getUser())。在设计实体的持久化过程中,它总是期望 ORM 中的用户字段(而不是 id)有一个用户对象。在 ORM 中,用户和设计之间的前键关系由对象映射。

因此,在设计实体的持久性期间,您的情况 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 文件或注释(如果您使用注释)

于 2012-07-29T06:32:57.463 回答