【问题标题】:Updating entity with mappings in Doctrine2在 Doctrine2 中使用映射更新实体
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    相关资源
    最近更新 更多