2012-05-04 37 views
3

協會這個問題是關係到我的另一個問題:Doctrine2 gives me only first instance of related objects錯誤:類... 實體 ..沒有名爲

我想出了雙向關聯,試圖解決我的老問題,但現在我還有一個問題。

架構[EDITED]

XYZ\Bundle\CitiesBundle\Entity\Cities: 
    type: entity 
    table: cities 
    fields: 
    id: 
     id: true 
     type: integer 
     unsigned: false 
     nullable: false 
     generator: 
     strategy: IDENTITY 
    name: 
     type: string 
     length: 50 
     fixed: false 
     nullable: false 
    landarea: 
     type: decimal 
     nullable: false 
    density: 
     type: integer 
     unsigned: false 
     nullable: false 
    population: 
     type: integer 
     unsigned: false 
     nullable: false 
    manyToOne: 
    state: 
     targetEntity: States 
     cascade: { } 
     inversedBy: cities 
     joinColumn: 
     state_id: 
      referencedColumnName: id 
    lifecycleCallbacks: { } 

實體:

class Cities 
{ 
    //other vars 

    /** 
    * @var XYZ\Bundle\CitiesBundle\Entity\States 
    */ 
    private $state; 

    //other get/set  

    /** 
    * Set state 
    * 
    * @param XYZ\Bundle\CitiesBundle\Entity\States $state 
    */ 
    public function setState(\XYZ\Bundle\CitiesBundle\Entity\States $state) 
    { 
     $this->state = $state; 
    } 

    /** 
    * Get state 
    * 
    * @return XYZ\Bundle\CitiesBundle\Entity\States 
    */ 
    public function getState() 
    { 
     return $this->state; 
    } 
} 

class States 
{ 
    //other vars and get/set 

    private $cities; 

    public function __construct() 
    { 
     $this->cities = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * Add cities 
    * 
    * @param XYZ\Bundle\CitiesBundle\Entity\Cities $cities 
    */ 
    public function addCities(\XYZ\Bundle\CitiesBundle\Entity\Cities $cities) 
    { 
     $this->cities[] = $cities; 
    } 

    /** 
    * Get cities 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getCities() 
    { 
     return $this->cities; 
    } 
} 

QueryBuilder的用法:

$query = $em->createQueryBuilder() 
       ->select('c','s') 
       ->from('CitiesBundle:Cities', 'c') 
       ->innerJoin('c.state', 's') 
       ->orderBy('c.population', 'DESC') 
       ->setMaxResults(10) 
       ->getQuery(); 

和錯誤是:

[Semantical Error] line 0, col 58 near 's ORDER BY c.population': Error: Class XYZ\Bundle\CitiesBundle\Entity\Cities has no association named state

產生DQL:

SELECT c, s FROM CitiesBundle:Cities c INNER JOIN c.state s ORDER BY c.population DESC

恥辱:(

有人能幫助我解決我的問題?

[編輯]

我編輯的城市架構,現在的錯誤是:

Notice: Undefined index: name in /home/marek/devel/sf2/cities/vendor/doctrine/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php line 473

回答

2

我敢肯定joinColumns:(注意複數形式),僅在Many-To-Many關係中使用。在其他關係中,您應該使用joinColumn

在城市XML,可以嘗試:

joinColumn: 
    name: state_id 
    referencedColumnName: id 

除此之外嘗試重命名「多對一」在你的XML「多對一」,但我懷疑這種情況下,是這裏的問題...

希望這有助於...

+0

謝謝。我做了你的建議。我編輯了我的問題來添加完整的城市模式和新的錯誤。 – keram

+0

嗯它說它缺少名爲'name'的選項。你有沒有嘗試完全像我在上面的答案中寫的?也就是說,你用上面的xml代碼替換了「'state_id:referencedColumnName:id'」? –

+0

我擁有YAML中的所有配置。我把它放在一起Cities.orm.yml – keram

2

請注意,使用Symfony時,它將首先查看映射YAML文件並忽略實體註釋。我花了很多年改變我的註釋,而它一直加載YAML映射文件。

+0

我有這個問題,我有改變了實體文件而不是YAML文件(在'doctrine'文件夾中隱藏了多個文件)。編輯了兩個YAML文件並且錯誤已解決。 – mickburkejnr