找出OneToMany和ManyToOne映射

时间:2015-10-16 08:04:15

标签: php symfony doctrine-orm doctrine

在Symfony2中,使用Doctrine,我有两个实体:Job和User。

我遵循了学说文档,并想出了如何映射ManyToOne和OneToMany关系。

这是我的用户类:

   /**
     * User
     *
     * @ORM\Table(name="user")
     * @ORM\Entity
     */
    class User extends BaseUser
    {

        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        protected $id;

        //it has all the necessary fields (username, pass and so on) and the ones related to Job entity:


        /**
         * @ORM\OneToMany(targetEntity="AppBundle\Entity\Job", mappedBy="user")
         * @Type("AppBundle\Entity\Job")
         **/
        protected $jobs;

        /**
         * Constructor
         */
        public function __construct()
        {
            parent::__construct();
            $this->jobs = new ArrayCollection();
        }

        /**
         * @return ArrayCollection
         */
        public function getJobs()
        {
            return $this->jobs;
        }

        /**
         * @param $jobs
         */
        public function setJobs($jobs)
        {
            $this->jobs = $jobs;
        }

        /**
         * {@inheritdoc}
         */
        public function addJob(Job $job)
        {
            $this->jobs->add($job);
            $job->setUser($this);
        }

        /**
         * {@inheritdoc}
         */
        public function removeJob(Job $job)
        {
            $this->jobs->removeElement($job);
        }

另一方面,我有这样写的Job实体:

    /**
     * Job
     *
     * @ORM\Table(name="hr_job")
     * @ORM\Entity
     * @ORM\Entity(repositoryClass="AppBundle\Repo\JobRepository")
     * @HasLifecycleCallbacks
     */
    class Job
    {

        /**
         * @var integer
         *
         * @Type("integer")
         * @ORM\Column(name="job_id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;

        //other properties go here (title, description and email)

        /**
         * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="jobs")
         * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true)
         * @Expose
         * @Type("AppBundle\Entity\User")
         **/
        protected $user;

        /**
         * @return mixed
         */
        public function getUser()
        {
            return $this->user;
        }

        /**
         * @param mixed $user
         */
        public function setUser($user)
        {
            $this->user = $user;
        }

在控制器中,我为登录用户添加了一个Job,它插入就好了。它有一个与适当用户相关的user_id外键。

但是,当我尝试让该用户添加所有作业时,会出现问题。

出于某种原因,$ user-> getJobs()始终为空。它表现得很奇怪。我尝试在php中转储它,我什么都没得到。我试着把它倾倒在树枝上,我得到的PersistentCollection对象对我来说并不意味着什么。

任何想法我做错了什么?

编辑:这是我的控制器代码。序列化已正确完成。

        $serializer = SerializerBuilder::create()->build();
        $jobJSON = $request->getContent();

        $loggedInUser = $this->getUser();

        $jobClassObject = $serializer->deserialize($jobJSON, "AppBundle\Entity\Job", "json");

        $jobClassObject->setUser($loggedInUser);

        //$loggedInUser->addJob($jobClassObject);

        $em = $this->getDoctrine()->getManager();

        $em->persist($jobClassObject);
        $em->flush();

2 个答案:

答案 0 :(得分:2)

In the documentation你可以读到:

  

Doctrine只会检查协会的拥有方是否有变更。

here详细说明:

  

要完全理解这一点,请记住在对象世界中如何维护双向关联。关联的每一侧有2个引用,这两个引用都代表相同的关联,但可以彼此独立地改变。当然,在正确的应用程序中,双向关联的语义由应用程序开发人员正确维护(这是他的职责)。 Doctrine需要知道这两个内存引用中的哪一个应该是持久化的,哪些不是。这就是拥有/反向概念主要用于。

因此,您有责任处理反面,这意味着您在设置拥有方时必须也更新反面

/**
 * @param mixed $user
 */
public function setUser($user)
{
    $this->user = $user;
    $user->addJob($this);
}

答案 1 :(得分:1)

您需要在User实体类中实现addJob()/ removeJob()方法。