web-dev-qa-db-ja.com

doctrine m:nリレーションの未定義のインデックス

M:nに関連する「department」と「newsItem」があります。部門のnewsItemsを列挙しようとするたびに、dbからの取得をトリガーすると、次のエラーが発生します。

 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 807 
 at BasicEntityPersister-> getManyToManyStatement(array( 'fieldName' => 'newsItems'、 'joinTable' => array()、 'targetEntity' = > 'UfscarDfmc\Org Bundle\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 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)、ob ject(PersistentCollection))
 in /.../vendor/doctrine/lib/Doctrine/ORM/UnitOfWork.php at 2088 
 at UnitOfWork-> loadCollection(object(PersistentCollection))
 in /.../vendor/doctrine/lib/Doctrine/ORM/PersistentCollection.php at 207 
 at PersistentCollection-> initialize()
 in /.../vendor/ doctrine/lib/Doctrine/ORM/PersistentCollection.php at 474 
 at PersistentCollection-> count()
 in at at 
 at count(object(PersistentCollection))
 in /.../src/UfscarDfmc/OrgBundle/Controller/DepartmentController.php at line 53 
 at DepartmentController-> showAction( 'graduacao')
 in at line 
23
Jan

私が正しければ...

あなたの場合、DepartmentクラスのmappedByはNewsItemクラスのプロパティである必要があります。

23
pderaaij

私は同じ問題を抱えており、StackOverflowの答えは正しいのに十分な深さではありません。 Doctrine jiraの問題の1つで見つかりました

走れば

doctrine:schema:validate

その後、それはあなたに問題が何であるかを教えてくれます。

37
Bae

あなたはおそらくあなたの関数表記に何かが足りないでしょう...これを見てください:

http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html#many-to-many-bidirectional

@JoinTable表記が欠落しているようです-所有側と逆側を逆にしてみてください。

1
geezmo