2015-10-16 107 views
0

,我有两个实体:Job和User。在Symfony2中使用Doctrine找出OneToMany和ManyToOne映射

我遵循了doctrine文档并想出了如何映射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 
    * 
    * @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; 
     } 

在控制器,我加入了一个工作,在登录用户,它被插入就好。它有一个与合适用户相关的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(); 
+0

为什么你制定者返回任何结果? – scoolnico

+0

刚刚修复了它 –

回答

1

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

+0

我已经得到了那些,忘了粘贴,对不起。 –

+0

我发现这个例子:http://future500.nl/articles/2013/09/more-on-one-to-manymany-to-one-associations-in-doctrine-2/但没有用例我需要。这真令人沮丧。如何在不创建单独查询的情况下访问特定用户的作业列表? –

+0

只需加入该表。你可以这样做(假设下面的代码是在仓库类中): $ this-> createQueryBuilder('user') - > select('user,jobs') - > leftJoin('user.jobs'); 它可以让你为每个用户提供工作而无需额外的查询。 – Alex

2

In the documentation你可以读到:

学说将只检查关联的持有端更改。详细

而且here

要充分理解这一点,记住协会如何双向保持在对象世界。关联的每一边有两个引用,这两个引用都表示相同的关联,但可以彼此独立地进行更改。当然,在正确的应用程序中,双向关联的语义由应用程序开发人员妥善维护(,他的责任是)。学说需要知道这两个内存中引用中哪一个是应该被保留的,哪些不是。这是拥有/反向概念主要用于的内容。

所以这是你的责任,采取反侧的照顾,这意味着你必须当您将拥有方也更新反侧

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

我已经多次阅读文档的这一部分,并且通过一切手段它应该工作。我将用控制器代码更新这个问题。我用你的代码更新了我的setUser方法,但是现在我得到了Bad Gateway nginx错误。 –

+0

您是否尝试在此方法中添加'addJob'?我99%肯定它会工作。 – Wilt

+0

并从'addJob'方法中删除'$ job-> setUser($ this);'您应该从拥有方... – Wilt

相关问题