2013-06-19 96 views
3

我已經看過堆棧溢出和網絡上其他地方的字面問題/答案,但無法找到解決此問題的辦法。Symfony 2與Doctrine之間的一對多關係

在我解釋這個問題,我有:

  • 剝去我的實體,從而使他們只有
  • 已清除學說查詢緩存/元數據緩存
  • 降到最低的屬性和方法,重新架構
  • 檢查我的拼寫

我有以下兩個實體:

<?php 
namespace Docker\ApiBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
*/ 
class Source 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="integer") 
    * @ORM\ManyToOne(targetEntity="Project",inversedBy="sources") 
    * @ORM\JoinColumn(referencedColumnName="id") 
    */ 
    private $project; 

} 


<?php 
namespace Docker\ApiBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
*/ 
class Project 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToMany(targetEntity="Source", mappedBy="project") 
    */ 
    private $sources; 

    public function __construct() { 
    $this->sources = new ArrayCollection(); 
    } 

    public function getSources() { 
    return $this->sources; 
    } 
} 

因此,許多'來源'可以屬於一個'項目'。

在我的控制,我有:

$em = $this->getDoctrine()->getManager(); 
$project = $em->find('Docker\ApiBundle\Entity\Project', 1); 
$sources = $project->getSources()->toArray(); 

我已經試過很多東西,但我總是得到:

Notice: Undefined index: project in /.../www/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1577 

就像我說的,我知道有很多的問題,到處約這,但沒有一個接受的答案解決了我的問題。

這一切對於使用Doctrine2來說都非常重要,所以不知道我做錯了什麼 - 它可能是非常明顯的。

任何幫助,將不勝感激。

+0

$ project var not null?或者當 - > getSources() - > toArray();那崩潰? – Sybio

+0

$ project var不爲空,是 - 當我在控制器中執行'$ sources = $ project-> getSources() - > toArray();'時,會導致異常。如果我拿出來,那就沒問題。 – JonB

回答

5

您有:

/** 
* @ORM\Column(type="integer") 
* @ORM\ManyToOne(targetEntity="Project",inversedBy="sources") 
* @ORM\JoinColumn(referencedColumnName="id") 
*/ 
private $project; 

刪除:

@ORM\Column(type="integer") 

從註釋。

+0

啊哈!這就對了。它也是有意義的。謝謝。 – JonB

1

如果這正是您的代碼,我沒有看到您的項目類中的名稱空間。嘗試添加命名空間行「命名空間Docker \ ApiBundle \ Entity;」。 如果這是相同的文件夾,則不需要「使用」,但如果它是其他包或文件夾的一部分,請嘗試放入一條類似「使用Docker \ ApiBundle \ Entity \ Project;」的行 在您的Source類中。我希望它可以幫助..

否則:

<?php 
namespace Azimut\ApiBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
*/ 
class Source 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    private $name; 


    /** 
    * @ORM\Column(type="integer") 
    * @ORM\ManyToOne(targetEntity="Azimut\ApiBundle\Entity\Project", inversedBy="sources") 
    * @ORM\JoinColumn(onDelete="CASCADE") 
    */ 
    private $project; 


/** 
* Get id 
* 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set project 
* 
* @param integer $project 
* @return Source 
*/ 
public function setProject($project) 
{ 
    $this->project = $project; 

    return $this; 
} 

/** 
* Get project 
* 
* @return integer 
*/ 
public function getProject() 
{ 
    return $this->project; 
} 
} 


<?php 
namespace Azimut\ApiBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity 
*/ 
class Project 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToMany(targetEntity="Azimut\ApiBundle\Entity\Source", mappedBy="object", cascade={"all"}) 
    */ 
    private $sources; 

    public function __construct() { 
    $this->sources = new ArrayCollection(); 
    } 

    public function getSources() { 
    return $this->sources; 
    } 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

/** 
* Add sources 
* 
* @param \Azimut\ApiBundle\Entity\Source $sources 
* @return Project 
*/ 
public function addSource(\Azimut\ApiBundle\Entity\Source $sources) 
{ 
    $this->sources[] = $sources; 

    return $this; 
} 

/** 
* Remove sources 
* 
* @param \Azimut\ApiBundle\Entity\Source $sources 
*/ 
public function removeSource(\Azimut\ApiBundle\Entity\Source $sources) 
{ 
    $this->sources->removeElement($sources); 
} 
} 

和控制器的小部分: 公共職能helloAction()

{ 
     $id = 1; 
     $em = $this->getDoctrine()->getManager(); 
     $project = $em->getRepository('Azimut\ApiBundle\Entity\Project')->find($id); 

     $source1 = $em->getRepository('Azimut\ApiBundle\Entity\Source')->find(3); 
     $source2 = $em->getRepository('Azimut\ApiBundle\Entity\Source')->find(5); 
     $project->addSource($source1); 
     $sources = array(); 
     $sources = $project->getSources(); 
     var_dump($sources); 
     return .... 
} 

,這只是正常的我。

+0

好點 - 但它只是不是那裏的帖子的格式。我已更新它,以便名稱空間顯示。 – JonB

+0

我編輯我的答案,試着讓我知道。 – gerda

+0

沒有運氣:(同樣的錯誤 – JonB

相關問題