【发布时间】:2012-07-28 20:21:18
【问题描述】:
我一直在做 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 时,我真的不想添加数据库调用来获取整个用户。处理这个最简单的方法是什么?
【问题讨论】:
-
在您持久化设计实体的控制器操作中 - 您是否已经获取用户 e。 G。用于访问/权限检查等?顺便说一句,如果你这样做 $design->user = new User($userId);您可能会从您的数据库中获得另一个用户的持久性或重复输入错误。
-
这是个好问题。设计通过 API 提交(它们不是图像,而是规范),所以我使用安全令牌来确定用户 ID。 API 只是获取令牌及其设计规范,而令牌不包含整个用户对象。这只是关于新设计,因为你是对的,当他们编辑现有设计时,控制器会显示整个对象,包括 $user。
标签: symfony doctrine-orm