Details
-
Type:
Bug
-
Status:
Resolved
-
Priority:
Blocker
-
Resolution: Fixed
-
Affects Version/s: 1.0.0BETA2
-
Fix Version/s: 1.0.0BETA2
-
Component/s: None
-
Labels:None
-
Environment:Mac OS X, MAMP
Description
There is still a problem with Single Collection Inheritance.
Please consider the following code :
/**
* @Document(db="forum", collection="Items")
* @InheritanceType("SINGLE_COLLECTION")
* @DiscriminatorField(fieldName="type")
* @DiscriminatorMap({0="Items", 1="Stuffs"})
*/
class Items
{
/**
*
* @id
*/
public $id;
/**
* @String
*/
public $title;
}
/**
* @Document(db="forum", collection="Items")
*/
class Stuffs extends Items
{
/**
*
* @id
*/
public $id;
/**
* @String
*/
public $stuffname;
}
$a = new Stuffs();
$a->stuffname = 'TTT';
$dm->persist($a);
$dm->flush();
Resulting in the database with :
{
"_id": ObjectId("4d5dd082b53251b84e000000"),
"stuffname": "TTT",
"type": 1
}
Now if I do :
$result = $dm->find('Items', $a->id);
then $result is an instance of Stuffs
But if I try :
$result = $dm->find('Items', '4d5dd082b53251b84e000000');
then $result is an instance of Items
Note that '$a->id' is a string, the same string containing '4d5dd082b53251b84e000000', so :
$result = $dm->find('Items', $a->id);
$result = $dm->find('Items', '4d5dd082b53251b84e000000');
are semantically equivalent. It seems however that hydration would ignore the DiscriminatorMap in the second example.
However If you do :
$result = $dm->find('Stuffs', '4d5dd082b53251b84e000000');
You'll get a Stuffs as a result.
Now I tried to find a workaround when you don't know the type of the returned object. My initial intention was to first fetch a document with :
$result = $dm->find('Items', '4d5dd082b53251b84e000000');
Then I'm testing a property in the objet to see if it's a Stuffs, if it is, I tried an new :
$result = $dm->find('Stuffs', '4d5dd082b53251b84e000000');
In order to fetch a Stuffs. But ... I still get a *Items"!
So basically, if you do :
$result = $dm->find('Stuffs', '4d5dd082b53251b84e000000');
You get a Stuffs. But if you do :
$dm->find('Items', '4d5dd082b53251b84e000000');
$result = $dm->find('Stuffs', '4d5dd082b53251b84e000000');
You get a Items!
Hi, can you make a phpunit testcase here? https://github.com/doctrine/mongodb-odm/tree/master/tests/Doctrine/ODM/MongoDB/Tests/Functional/Ticket