2015-10-16 154 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

相關問題