Symfony 第2.5条原则。OneTONE关系共享主键
在我的应用程序中,当用户注册时,我必须向他们发送一封带有验证密钥的电子邮件,就像大多数网站上通常发生的那样,我尝试使用Dority来完成此操作,但当我尝试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 { /**
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
实体上指定联接列,否则,条令不知道这两个实体是如何关联的。