通过Doctrine从实体创建另一个实体

时间:2014-09-17 23:05:42

标签: symfony doctrine-orm

我有两个表,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.如何在实体类中获得教义的实例?

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

Doctrine: Transitive persistence / Cascade Operations

Symfony: Persisting Objects to the Database