Details
-
Type:
Bug
-
Status:
Resolved
-
Priority:
Minor
-
Resolution: Fixed
-
Affects Version/s: 2.2.2
-
Fix Version/s: None
-
Component/s: ORM
-
Labels:None
-
Environment:Irrelevant
Description
I have the following entity hierarchy:
/** * @Entity * @InheritanceType("SINGLE_TABLE") * @DiscriminatorColumn(name="type", type="string") * @DiscriminatorMap({ "prospectEdited" = "Application\Domain\Model\Event\ProspectEditedEvent" }) */ abstract class Event { // ... } /** * @Entity */ abstract class ProspectEvent extends Event { /** * @ManyToOne(targetEntity="Application\Domain\Model\Prospect") */ protected $prospect; } /** * @Entity */ class ProspectEditedEvent extends ProspectEvent { // ... }
Although ProspectEvent is an abstract class, I need to mark it as @Entity, so that I can query for any type of ProspectEvent:
SELECT e FROM ProspectEvent e WHERE e.prospect = ?
So far, so good.
The problem happens when I query the root class:
SELECT e FROM Event e
The query works fine, but the returned ProspectEvent entities have a NULL $prospect property.
I noticed that in that case, the DocBlock for $prospect is totally ignored (a wrong @JoinColumn name for example, doesn't throw an exception).
The workaround to make it work, is to add a "fake" entry to the discriminator map for the abstract class:
@DiscriminatorMap({
"prospectEvent" = "Application\Domain\Model\Event\ProspectEvent"
"prospectEdited" = "Application\Domain\Model\Event\ProspectEditedEvent"
})
Even though there is no such "prospectEvent" discriminator entry possible, as the class is abstract.
Final point, if I remove the @Entity DocBlock on ProspectEvent, $prospect is hydrated correctly, but then it is not possible to issue a DQL query on ProspectEvent anymore.