2011-09-12 6 views
19

J'ai un 'département' et 'newsItem', qui sont liés m: n. Chaque fois que je tente d'énumérer sur bulletins d'informations, déclenchant ainsi la récupération d'un ministère de la db, je reçois cette erreur:Indéfini index sur doctrine m: n relation

 
at ErrorHandler ->handle (
    '8', 
    'Undefined index: newsItems', 
    '/.../ufscar_symfony/vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php', 
    '807', 
    array(
    'assoc' => array(
     'fieldName' => 'newsItems', 
     'joinTable' => array(), 
     'targetEntity' => 'UfscarDfmc\OrgBundle\Entity\NewsItem', 
     'mappedBy' => 'newsItems', 
     'inversedBy' => null, 
     'cascade' => array(), 
     'fetch' => '2', 
     'type' => '8', 
     'isOwningSide' => false, 
     'sourceEntity' => 'UfscarDfmc\OrgBundle\Entity\Department', 
     'isCascadeRemove' => false, 
     'isCascadePersist' => false, 
     'isCascadeRefresh' => false, 
     'isCascadeMerge' => false, 
     'isCascadeDetach' => false 
    ), 
    'sourceEntity' => object(Department), 
    'offset' => null, 
    'limit' => null, 
    'criteria' => array(), 
    'sourceClass' => object(ClassMetadata) 
) 
) 

Ce qui est particulièrement étrange est, qu'il existe une autre relation dans le département, à une autre m: n entité, cela fonctionne, et il n'y a pas de différence dans la façon dont la cartographie est mise en place, j'ai vérifié au moins 10 fois.

Les classes et la pleine stacktrace:

 /** 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="...\OrgBundle\Entity\DepartmentRepository") 
*/ 
class Department 
{ 
     /** 
    * Inverse Side 
    * 
    * @ManyToMany(targetEntity="NewsItem", mappedBy="newsItems") 
    */ 
    private $newsItems; 

    public function __construct() 
    { 
     $this->newsItems = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
    /** 
    * Get newsItems 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getNewsItems() 
    { 
     return $this->newsItems; 
    } 
} 


class NewsItem 
{ 
    /** 
    * Owning Side 
    * 
    * @ManyToMany(targetEntity="Department", inversedBy="newsItems") 
    * @JoinTable(name="newsItems_departments", 
    *  joinColumns={@JoinColumn(name="newsItem_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="department_id", referencedColumnName="id")} 
    *  ) 
    */ 
    private $departments; 

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

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


public function showAction($slug) 
{ 
    $em = $this->getDoctrine()->getEntityManager(); 
    $entity = $em->getRepository('UfscarDfmcOrgBundle:Department')->findOneBySlug($slug); 

    return array(
     'entity' => $entity, 
     'newsItems' => $entity->getNewsItems(), # enumerating over this gives the error 
    ); 
} 
 
at ErrorHandler ->handle ('8', 'Undefined index: newsItems', '/.../vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php', '807', array('assoc' => array('fieldName' => 'newsItems', 'joinTable' => array(), 'targetEntity' => 'UfscarDfmc\OrgBundle\Entity\NewsItem', 'mappedBy' => 'newsItems', 'inversedBy' => null, 'cascade' => array(), 'fetch' => '2', 'type' => '8', 'isOwningSide' => false, 'sourceEntity' => 'UfscarDfmc\OrgBundle\Entity\Department', 'isCascadeRemove' => false, 'isCascadePersist' => false, 'isCascadeRefresh' => false, 'isCascadeMerge' => false, 'isCascadeDetach' => false), 'sourceEntity' => object(Department), 'offset' => null, 'limit' => null, 'criteria' => array(), 'sourceClass' => object(ClassMetadata))) 
in /.../vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php at line 807 
at BasicEntityPersister ->getManyToManyStatement (array('fieldName' => 'newsItems', 'joinTable' => array(), 'targetEntity' => 'UfscarDfmc\OrgBundle\Entity\NewsItem', 'mappedBy' => 'newsItems', 'inversedBy' => null, 'cascade' => array(), 'fetch' => '2', 'type' => '8', 'isOwningSide' => false, 'sourceEntity' => 'UfscarDfmc\OrgBundle\Entity\Department', 'isCascadeRemove' => false, 'isCascadePersist' => false, 'isCascadeRefresh' => false, 'isCascadeMerge' => false, 'isCascadeDetach' => false), object(Department)) 
in /.../vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php at line 778 
at BasicEntityPersister ->loadManyToManyCollection (array('fieldName' => 'newsItems', 'joinTable' => array(), 'targetEntity' => 'UfscarDfmc\OrgBundle\Entity\NewsItem', 'mappedBy' => 'newsItems', 'inversedBy' => null, 'cascade' => array(), 'fetch' => '2', 'type' => '8', 'isOwningSide' => false, 'sourceEntity' => 'UfscarDfmc\OrgBundle\Entity\Department', 'isCascadeRemove' => false, 'isCascadePersist' => false, 'isCascadeRefresh' => false, 'isCascadeMerge' => false, 'isCascadeDetach' => false), object(Department), object(PersistentCollection)) 
in /.../vendor/doctrine/lib/Doctrine/ORM/UnitOfWork.php at line 2088  
at UnitOfWork ->loadCollection (object(PersistentCollection)) 
in /.../vendor/doctrine/lib/Doctrine/ORM/PersistentCollection.php at line 207  
at PersistentCollection ->initialize() 
in /.../vendor/doctrine/lib/Doctrine/ORM/PersistentCollection.php at line 474  
at PersistentCollection ->count() 
in at line  
at count (object(PersistentCollection)) 
in /.../src/UfscarDfmc/OrgBundle/Controller/DepartmentController.php at line 53  
at DepartmentController ->showAction ('graduacao') 
in at line 

Répondre

20

Si je ne me trompe pas ...

Votre mappedBy dans le département de la classe devrait être la propriété de la classe NewsItem, dans vos départements de cas au lieu de bulletins d'informations.

+3

100% correct! Parfois, il semble que 10 fois ne suffit pas :) Merci beaucoup! – Jan

+0

J'ai fait la même erreur plusieurs fois. Il est facile d'oublier que vous avez besoin d'une propriété de la classe relative :) – pderaaij

20

Je rencontre le même problème, et les réponses sur StackOverflow ne vont pas assez loin. J'ai trouvé dans l'un des Doctrine jira issues:

Si vous exécutez

doctrine:schema:validate 

alors il vous dira quel est le problème.

Questions connexes