2011-09-12 12 views
19

Tengo un 'departamento' y 'newsItem', que están relacionados m: n. Siempre que intento para enumerar más de NewsItems de un departamento, lo que desencadena la recuperación de la db, me sale este error:Índice no definido sobre la doctrina m: n relación

 
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) 
) 
) 

Lo que es especialmente extraño es, que no es otra relación en el departamento, a otro m: n entidad, eso simplemente funciona, y no hay diferencia en la forma en que se establece el mapeo, lo comprobé 10 veces al menos.

Las clases y la StackTrace completo:

 /** 
* @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 

Respuesta

20

Si estoy en lo correcto ...

Su mappedBy en el Departamento de clase debe ser la propiedad de la clase elemento Novedades, en sus departamentos de casos en lugar de NewsItems.

+3

¡100% correcto! A veces parece que 10 veces no es suficiente :) ¡Muchas gracias! – Jan

+0

He cometido el mismo error un par de veces. Es fácil olvidar que necesitas una propiedad de la clase relacionada :) – pderaaij

20

Estoy teniendo el mismo problema, y ​​las respuestas en StackOverflow son correctas, pero no lo suficientemente profundas. He encontrado en uno de los Doctrine jira issues:

Si ejecuta

doctrine:schema:validate 

entonces se le dirá cuál es el problema.

Cuestiones relacionadas