Details
Description
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.