Details
Description
We have a set of models that use Single Table inheritance and we are trying to select all objects of one type:
/** * @Entity * @InheritanceType("SINGLE_TABLE") * @DiscriminatorColumn(name="type", type="string") * @DiscriminatorMap({"Child"="Child", "OtherChild"="OtherChild"}) */ abstract class ParentModel { /** * @Id @Column(name="id", type="integer") * @GeneratedValue(strategy="AUTO") */ protected $id; /** @Column(type="string") */ public $property; function getId() {return $this->id;} } abstract class SubParent extends ParentModel { } /** * @Entity */ class Child extends SubParent { /** @Column(type="string") */ public $anotherProperty; } /** * @Entity */ class OtherChild extends SubParent { /** @Column(type="string") */ public $someOtherProperty; }
Now to query for all of the Child objects we do:
$children = $em->getRepository('Child')->findall();
foreach($children AS $child) {
echo $child->getId();
}
but we get "Notice: Undefined index: id in ./Doctrine/ORM/UnitOfWork.php on line 1727" on the finAll() call and the objects that aren't of the correct type have their properties nulled out. This is because the query that is being executed doesn't have any conditionals for the type of model it's looking for and the ORM doesn't check to make sure that the object is of the correct type.
This could be solved by having conditionals in the SQL query (chaining a bunch of 'or' statements for all of the child objects) or by pulling back all of the objects and then filtering out what isn't of the correct type. Unfortunately neither solution seems ideal.
I'll try to make a test case for this then.
Issue Links
- is referenced by
-
DDC-497
find() and findAll() on Repository do not work when SINGLE_TABLE inheritance is used
-
Activity
| Field | Original Value | New Value |
|---|---|---|
| Description |
We have a set of models that use Single Table inheritance and we are trying to select all objects of one type: {code} /** * @Entity * @InheritanceType("SINGLE_TABLE") * @DiscriminatorColumn(name="type", type="string") * @DiscriminatorMap({"Child"="Child"}) */ abstract class ParentModel { /** * @Id @Column(name="id", type="integer") * @GeneratedValue(strategy="AUTO") */ protected $id; /** @Column(type="string") */ public $property; function getId() {return $this->id;} } abstract class SubParent extends ParentModel { } /** * @Entity */ class Child extends SubParent { /** @Column(type="string") */ public $anotherProperty; } {code} Now to query for all of the Child objects we do: {code} $children = $em->getRepository('Child')->findall(); foreach($children AS $child) { echo $child->getId(); } {code} but we get "Notice: Undefined index: id in ./Doctrine/ORM/UnitOfWork.php on line 1727". This is because the query that is being executed doesn't have any conditionals for the type of model it's looking for and the ORM doesn't check to make sure that the object is of the correct type. This could be solved by having conditionals in the SQL query (chaining a bunch of 'or' statements for all of the child objects) or by pulling back all of the objects and then filtering out what isn't of the correct type. Unfortunately neither solution seems ideal. I'll try to make a test case for this then. |
We have a set of models that use Single Table inheritance and we are trying to select all objects of one type: {code} /** * @Entity * @InheritanceType("SINGLE_TABLE") * @DiscriminatorColumn(name="type", type="string") * @DiscriminatorMap({"Child"="Child", "OtherChild"="OtherChild"}) */ abstract class ParentModel { /** * @Id @Column(name="id", type="integer") * @GeneratedValue(strategy="AUTO") */ protected $id; /** @Column(type="string") */ public $property; function getId() {return $this->id;} } abstract class SubParent extends ParentModel { } /** * @Entity */ class Child extends SubParent { /** @Column(type="string") */ public $anotherProperty; } /** * @Entity */ class OtherChild extends SubParent { /** @Column(type="string") */ public $someOtherProperty; } {code} Now to query for all of the Child objects we do: {code} $children = $em->getRepository('Child')->findall(); foreach($children AS $child) { echo $child->getId(); } {code} but we get "Notice: Undefined index: id in ./Doctrine/ORM/UnitOfWork.php on line 1727" on the finAll() call and the objects that aren't of the correct type have their properties nulled out. This is because the query that is being executed doesn't have any conditionals for the type of model it's looking for and the ORM doesn't check to make sure that the object is of the correct type. This could be solved by having conditionals in the SQL query (chaining a bunch of 'or' statements for all of the child objects) or by pulling back all of the objects and then filtering out what isn't of the correct type. Unfortunately neither solution seems ideal. I'll try to make a test case for this then. |
| Attachment | DDC500Test.php [ 10560 ] |
| Attachment | DDC500Test.php [ 10560 ] |
| Attachment | DDC500Test.php [ 10561 ] |
| Fix Version/s | 2.0-BETA1 [ 10030 ] |
| Priority | Minor [ 4 ] | Critical [ 2 ] |
| Status | Open [ 1 ] | In Progress [ 3 ] |
| Status | In Progress [ 3 ] | Closed [ 6 ] |
| Resolution | Fixed [ 1 ] |
| Workflow | jira [ 11190 ] | jira-feedback [ 15610 ] |
| Workflow | jira-feedback [ 15610 ] | jira-feedback2 [ 17474 ] |
| Workflow | jira-feedback2 [ 17474 ] | jira-feedback3 [ 19731 ] |
- Request to http://www.doctrine-project.org/fisheye/ failed: Error in remote call to 'FishEye 0 (http://www.doctrine-project.org/fisheye/)' (http://www.doctrine-project.org/fisheye) [AbstractRestCommand{path='/rest-service-fe/search-v1/crossRepositoryQuery', params={query=DDC-500, expand=changesets[-21:-1].revisions[0:29],reviews}, methodType=GET}] : Received status code 503 (Service Temporarily Unavailable)
Adding another child class just to be clear.