我已经做了很长时间的直接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时,我真的不想添加数据库调用来抓取整个用户。处理这个问题最简单的方法是什么?
答案 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(如果使用注释)