OneToOne 实体不会在 Symfony2 中坚持使用 Doctrine

eri*_*sho 1 doctrine one-to-one persistent symfony

我在用户和学生之间的 Symfony 中有一个 OneToOne 关系,其中用户是所有者,当我尝试坚持更改时,双方都没有进行更改,这是我的最后一个配置:

<?php

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="BackendBundle\Repository\UserRepository")
 */
class User  implements UserInterface, \Serializable
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
    * @ORM\OneToOne(targetEntity="Student", mappedBy="user")
    */
    private $student;

    public function __construct() {
    }


    /**
     * Set student
     *
     * @param \BackendBundle\Entity\Student $student
     *
     * @return User
     */
    public function setStudent(\BackendBundle\Entity\Student $student)
    {
        $this->student = $student;

        return $this;
    }

    /**
     * Get student
     *
     * @return \BackendBundle\Entity\Student
     */
    public function getStudent()
    {
        return $this->student;
    }

}
Run Code Online (Sandbox Code Playgroud)

学生:

<?php

/**
 * Student
 *
 * @ORM\Table(name="Student")
 * @ORM\Entity(repositoryClass="BackendBundle\Repository\StudentRepository")
 */
class Student
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
    * @ORM\OneToOne(targetEntity="User", inversedBy="student")
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
    */
    private $user;

    public function __construct() {

    }
}
Run Code Online (Sandbox Code Playgroud)

并在控制器中:

    public function editAction(Request $request, User $user)
{
    $student = new Student();
    $user->setStudent($student);

    $em = $this->getDoctrine()->getManager();
    $em->persist($student);
    $user->setStudent($student);
    $em->persist($user);
    $em->flush();
    /.../
}
Run Code Online (Sandbox Code Playgroud)

我可以毫无例外地保存实体和更改,但我无法将它们关联起来,例如在视图中,当我这样做时,{{ user.student }}它给我空值,{{ student.user_id }}也是空值。

Don*_*sto 6

修改你的代码如下

 <?php

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="BackendBundle\Repository\UserRepository")
 */
class User  implements UserInterface, \Serializable
{
    /**
    * @ORM\OneToOne(targetEntity="Student", mappedBy="user", cascade={"persist"})
    */
    private $student;

    // ...

    /**
     * Set student
     *
     * @param \BackendBundle\Entity\Student $student
     *
     * @return User
     */
    public function setStudent(\BackendBundle\Entity\Student $student)
    {
        $this->student = $student;
        $student->setUser($this);

        return $this;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)
public function editAction(Request $request, User $user)
{
    $student = new Student();
    $user->setStudent($student);

    $em->flush();
}
Run Code Online (Sandbox Code Playgroud)

为什么是这个编辑?

因为学说“听”只改变拥有方(所以Student实体)。如果您想保留用户而不让学生头疼,您需要:

1 - 将学生设置为用户时,将用户设置为学生(拥有方)
2 - 在用户的学生属性上使用级联持久化

PS。:如果您使用学说(即使使用参数转换器)从数据库中检索用户(更一般的实体),则不需要显式调用persist该实体。