Details
-
Type:
Bug
-
Status:
Resolved
-
Priority:
Critical
-
Resolution: Invalid
-
Affects Version/s: 2.0-BETA4
-
Fix Version/s: None
-
Component/s: ORM
-
Security Level: All
-
Labels:None
Description
I create one Superclass and several Subclasses. The subclasses have properties with the same name (but as I also want to have Subclasses without these properties, this is the only elegant construction), in this example "name".
Now when I select the Superclass, I get all Subclass entities, but the "name" property is not hydrated correctly:
<?php namespace Entities; /** * @Entity * @InheritanceType("JOINED") * @DiscriminatorColumn(name="type", type="integer") * @DiscriminatorMap({ "1" = "Subclass1", "2" = "Subclass2" }) */ class Superclass { /** @Id @Column(type="integer") @GeneratedValue(strategy="AUTO") */ public $id; } /** @Entity */ class Subclass1 extends Superclass { /** @Column(type="string") */ public $name; } /** @Entity */ class Subclass2 extends Superclass { /** @Column(type="string") */ public $name; } /* */ $sub1 = new Subclass1; $sub1->name = 'sub1name'; $em->persist($sub1); $sub2 = new Subclass2; $sub2->name = 'sub2name'; $em->persist($sub2); $em->flush(); $em->clear(); $query = $em->createQuery('SELECT s FROM Entities\Superclass s'); foreach ($query->execute() as $s) { echo 'name = ' . $s->name . PHP_EOL; }
Output:
name = sub2name name =
The SQL however seems correct, both
"name" columns are selected. This seems to be a bug in hydration.
Quoting from the Docs, chapter "Architecture" on the requirements of entities (and inheritance):
Any two entity classes in a class hierarchy that inherit directly or indirectly from one another must not have a mapped property with the same name. That is, if B inherits from A then B must not have a mapped field with the same name as an already mapped field that is inherited from A.