我有两个表,user和userAttr。
'用户'和' userAttr'被捆绑在一起。
我想在插入用户行时在userAttr中插入一行。
所以这是我的想法。
在用户实体的prePersist()方法中创建userAttr的新数据行。
在Acme / UserBundle / Entity / User.php
中class User extends BaseUser implements ParticipantInterface
{
public function prePersist()
{
$userAttr = new userAttr();
$userAttr->setUser($this);
$userAttr->setEnabled(true);
$this->setUserAttr($userAttr);
$em = $this->getDoctrine()->getManager();
$em->persist($userAttr);
$em->flush();
但它显示的错误就是这样。
Fatal error: Call to undefined method Acme\UserBundle\Entity\User::getDoctrine() in
有两个问题。
1.我的基本想法是否正确?
2.如何在实体类中获得教义的实例?
答案 0 :(得分:1)
一般来说,你有一点谬误。一旦实体管理器保留了一个条目,它也将保持相关的一对一连接。因此,如果您持续 $ userAttr - 这是与您的用户的实例一对一连接 - 它将在之前保留用户持续存在。导致数据库中的双重着作。您可以通过将prePersist()调整为
来避免这种情况public function prePersist()
{
$userAttr = new userAttr();
$userAttr->setUser($this);
$userAttr->setEnabled(true);
$this->setUserAttr($userAttr);
}
这避免了找到获取实体管理器实例的方法。
答案 1 :(得分:1)
我先回答你的第二个问题。
你不可以,但你不应该这样做。您的实体类只是一个模型,它不了解 Doctrine , Symfony 或实体管理器。持久性将在更高层次上处理。
没有。正如我在前面所说的那样,持久性不应该是这个级别的担忧。在这里,您只需定义模型的属性和关系。
我想你的实体看起来有点像这样:
class User extends BaseUser implements ParticipantInterface
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// ...
/**
* @ORM\OneToOne(targetEntity="UserAttr", cascade={"persist"})
*/
private $userAttr;
public function setUserAttr(UserAttr $userAttr = null)
{
$this->userAttr = $userAttr;
return $this;
}
public function getUserAttr()
{
return $this->technician;
}
}
请注意与cascade={"persist"}
的关系中的UserAttr
选项。这就是告诉 Doctrine 它应该将它插入数据库的内容。
Doctrine: One-To-One, Unidirectional