Symfony 第2.5条原则。OneTONE关系共享主键

Symfony 第2.5条原则。OneTONE关系共享主键,symfony,doctrine-orm,orm,doctrine,one-to-one,Symfony,Doctrine Orm,Orm,Doctrine,One To One,在我的应用程序中,当用户注册时,我必须向他们发送一封带有验证密钥的电子邮件,就像大多数网站上通常发生的那样,我尝试使用Dority来完成此操作,但当我尝试persist()用户时,我无法让它工作 首先,我认为在这种情况下正确的方法是使用一对一单向关系,但我不知道使用双向关系是否更好。我两个都试过了,但总是出错 我仔细阅读了这两个问题: 以及。当我验证模式(php-bin/console-doctor:schema:validate)时,一切正常 class Usuario { /**

在我的应用程序中,当用户注册时,我必须向他们发送一封带有验证密钥的电子邮件,就像大多数网站上通常发生的那样,我尝试使用Dority来完成此操作,但当我尝试
persist()
用户时,我无法让它工作

首先,我认为在这种情况下正确的方法是使用一对一单向关系,但我不知道使用双向关系是否更好。我两个都试过了,但总是出错

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

以及。当我验证模式(
php-bin/console-doctor: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;

  // ...
}
这很像

现在,我正在尝试
persist()
一个新的Usuario和一个新的Usuario类别,如下所示:

$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)没有 标识/未设置id值。无法将其添加到标识映射中

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

  $em->persist($usuario);
  $em->flush();
  $em->persist($claveVal);
  $em->flush();
但我不想这样做,因为我希望它是一个
工作单元
,只使用
flush()
一次

此外,正如我上面链接的帖子的作者所说,在适当的时候获取id应该是Doctrine的工作

那么,如何仅使用
flush()
一次就可以实现这一点(并且不使用事务或侦听器,我相信有一种更简单的方法可以做到这一点)?使用双向一对一关系会更好吗?正如我所说,我也试过了,但我也犯了同样的错误


提前感谢。

可能会研究条令级联功能:您的ClaveVal实体应该有主键。这是肯定的。我尝试了
@ORM\OneToOne(targetEntity=“Usuario”,cascade={“persist”,“remove”})
,但没有成功@Artur,ClaveVal将usuario作为PK和fk。您需要在
usuario
实体或
ClaveVal
实体上指定联接列,否则,条令不知道这两个实体是如何关联的。