DDC-1397: Accesing a OneToMany relation with Child Classes and OneToOne relations. #2018

Closed
doctrinebot opened this Issue Sep 29, 2011 · 4 comments

2 participants

@doctrinebot

Jira issue originally created by user gbrunacci:

I am facing a small issue on Doctrine 2 that causes OneToOne relation needed to be part of the parent class. The error occurs when doing $content->getVersions() but not when doing $em->find("Model\Lantern\Content\Version", $id). The error message is:

Warning: Undefined index: summary in ORM/UnitOfWork.php:2012
Fatal error: Call to a member function setValue() on a non-object in ORM/UnitOfWork.php on line 2013

Error replication:

Simply by having a look at the model we can see what's causing the Bug, will avoid class annotations to make it simpler:

class Content{
    /****
    * @OneToMany(targetEntity="Version", mappedBy="content")
    */
    private $versions;
...
}

class Version{
    /****
     * @ManyToOne(targetEntity="Content", inversedBy="versions")
     * @JoinColumn(name="content*id", referencedColumnName="content*id")
     */
    private $content;
...
}

class Article extends Version{
    /*** @OneToOne(targetEntity="Model\Lantern\Content\Fieldset\Summary", mappedBy="version", cascade={"persist", "delete"}) **/
    private $summary;  
...
}

class Summary{
    /****
     * @OneToOne(targetEntity="Model\Lantern\Content\Version", inversedBy="summary")
     * @JoinColumn(name="version*id", referencedColumnName="version*id")
     */
    private $version;    
...
}

As you can see, Article::$summary targets Summary::$version, but Summary::$version targets Version::$summary. This in OOP is valid as Version is contained inside Article, so doing a downcasting will get Article::summary.

The reason I believe why using $em->find works is that $em->find already knows which child class is before doing map, and relations works fine.
On the other hand, when doing $content->getVersions(), Content::$versions targets Version, and looks like Doctrine does not resolve which child class it before mapping OneToOne relationshipg.

This bug doesn't occur with OneToMany or ManyToMany relationships.

@doctrinebot

Comment created by gbrunacci:

A side but useful note: when I move @OneToOne relation to the parent class Version, The error doesn't happen.

@doctrinebot

Comment created by @guilhermeblanco:

Should be the Summary::$version pointing to Article::$summary.

Your mapping is wrong conceptually in OOP, because you're referring a non-existing property of Version ($summary is only part of Article).
Please fix the issue and check out if the error still persist.

@doctrinebot

Comment created by @beberlei:

The mapping is wrong as guilherme said,

class Summary{
    /****
     * @OneToOne(targetEntity="Model\Lantern\Content\Article", inversedBy="summary")
     * @JoinColumn(name="version*id", referencedColumnName="version*id")
     */
    private $version;    
...
}
@doctrinebot

Issue was closed with resolution "Invalid"

@beberlei beberlei was assigned by doctrinebot Dec 6, 2015
@doctrinebot doctrinebot added this to the 2.1.2 milestone Dec 6, 2015
@doctrinebot doctrinebot closed this Dec 6, 2015
@doctrinebot doctrinebot added the Bug label Dec 7, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment