学说2.5。 OneToOne关系共享主键

时间:2017-07-05 22:02:29

标签: symfony doctrine-orm orm doctrine one-to-one

在我的应用中,当用户注册时,我必须向他们发送一封带有验证密钥的电子邮件,这通常发生在大多数网站上,我试图用Doctrine进行此操作,但我无法让它工作当我尝试persist()用户时。

首先,我认为在这种情况下正确的方法是使用OneToOne单向关系,但我不知道使用双向关系是否更好。我已经尝试了两种方法,而且总是出错。

我仔细阅读了这两个问题:

One to one relationship on two tables sharing primary key

Doctrine one-to-one unidirectional

以及this part of the documentation。当我验证架构(php bin/console doctrine:schema:validate)时,一切都很好。

class Usuario {
  /**
   * @ORM\Column(name="id", type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="IDENTITY")
   */
  private $id;

  // ...
}

class ClaveVal {
  /**
   * @ORM\Id
   * @ORM\OneToOne(targetEntity="Usuario")
   */
  private $usuario;

  /**
   * @ORM\Column(name="clave", type="string", length=20, nullable=false)
   * @Assert\NotBlank()
   */
  private $clave;

  // ...
}

这与this非常相似。

现在,我试图persist()为这个例子提供一个新的Usuario和一个新的ClaveVal:

$usuario = new Usuario();
// Add usuario attributes
$claveVal = new ClaveVal();
$claveVal->setUsuario($usuario);
$claveVal->setClave(‘123456’);
$em->persist($usuario);
$em->persist($claveVal);

但是我收到了这个错误:

  

类型' AppBundle \ Entity \ ClaveVal'的给定实体   (AppBundle \ Entity \ ClaveVal @ 000000007020f28f0000000031d5c8c6)没有   identity / no id值设置。它无法添加到身份地图

我知道为什么会这样。这非常有效:

  $em->persist($usuario);
  $em->flush();
  $em->persist($claveVal);
  $em->flush();

但我不想这样做,因为我希望它只使用unit of work flush()一次。

此外,正如我上面链接的帖子的作者所说,flush()在适当的时候获得身份证明应该是Doctrine的工作。

那么,我怎样才能使用flush()只实现一次(并且不使用事务或监听器,我确定有更简单的方法)?使用双向OneToOne关系会更好吗?正如我所说的那样,我也试过了,但我也遇到了同样的错误。

提前致谢。

0 个答案:

没有答案