2011-09-12 65 views
19

我有一個'部門'和'newsItem',它們是相關的m:n。每當我試圖枚舉一個部門的newsItems,從而從DB觸發檢索,我得到這個錯誤:未定義的指標m: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) 
) 
) 

什麼特別奇怪的是,有百貨另一個關係到另一個M:N實體,那只是起作用,並且映射的設置沒有區別,我至少檢查了10次。

的類和完整的堆棧跟蹤:

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

回答

20

如果我是正確的......

你在班上處的mappedBy應該是NewsItem類的newsItems代替的財產,你的情況下,主管部門。

+3

100%正確!有時似乎10次是不夠的:)非常感謝! – Jan

+0

我犯了同樣的錯誤幾次。很容易忘記你需要相關課程的資產:) – pderaaij

20

我有同樣的麻煩,並且正確的時候StackOverflow的答案不夠深入。我在Doctrine jira issues的一個發現:

如果運行

doctrine:schema:validate 

然後它會告訴你是什麼問題。