[DDC-1397] Accesing a OneToMany relation with Child Classes and OneToOne relations. Created: 29/Sep/11 Updated: 15/Oct/11 Resolved: 15/Oct/11 |
|
| Status: | Resolved |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.1, 2.1.1, 2.1.2 |
| Fix Version/s: | 2.1.2 |
| Security Level: | All |
| Type: | Bug | Priority: | Major |
| Reporter: | Gabriel Brunacci | Assignee: | Benjamin Eberlei |
| Resolution: | Invalid | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Ubuntu 10.10 64bit |
||
| 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. This bug doesn't occur with OneToMany or ManyToMany relationships. |
| Comments |
| Comment by Gabriel Brunacci [ 29/Sep/11 ] |
|
A side but useful note: when I move @OneToOne relation to the parent class Version, The error doesn't happen. |
| Comment by Guilherme Blanco [ 04/Oct/11 ] |
|
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). |
| Comment by Benjamin Eberlei [ 15/Oct/11 ] |
|
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;
...
}
|