在我的应用中,当用户注册时,我必须向他们发送一封带有验证密钥的电子邮件,这通常发生在大多数网站上,我试图用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关系会更好吗?正如我所说的那样,我也试过了,但我也遇到了同样的错误。
提前致谢。