从MongoDB获取Child类型的对象而不是父类型

Has*_*san 10 php doctrine mongodb symfony

我试图从MongoDB中检索对象,但我面临一个问题,即它返回基类型的元素而不是子元素而且它引起了麻烦,我发现它以某种方式依赖于属性的值.

/**
 * @MongoDB\Document(
 *     collection="zoo",
 *     repositoryClass="ZooRepository",
 * )
 */
class Zoo
{
    /**
     * @MongoDB\ReferenceMany(targetDocument="Animal", inversedBy="zoo", strategy="addToSet")
     * @var \Doctrine\Common\Collections\ArrayCollection
     */
    protected $animals;


    /**
     * @return mixed
     */
    public function getAnimals()
    {
        return $this->animals->toArray();
    }

    //Some more code

}


/**
 * @MongoDB\Document(
 *     repositoryClass="AnimalRepository",
 *     collection="animals"
 * )
 * @MongoDB\InheritanceType("SINGLE_COLLECTION")
 * @MongoDB\DiscriminatorField("discriminator")
 * @MongoDB\DiscriminatorMap({
 *     "animal"="Animal",
 *     "birds"="Bird",
 *     "mamals"="Mamals"})
 */
class Animal
{
    /**
     * @MongoDB\ReferenceMany(targetDocument="Location", mappedBy="animals", simple=true, cascade={"persist"})
     *
     * @Assert\Count(min="0", max="1")
     */
    protected $locations;
}


/**
 * @MongoDB\Document(repositoryClass="AnimalRepository")
 */
class Bird extends Animal
{

}

/**
 * @MongoDB\Document(repositoryClass="AnimalRepository")
 */
class Mamals extends Animal
{

}
Run Code Online (Sandbox Code Playgroud)

问题是:当我从ZooHandler调用getAnimals()时,它返回Animal类型的对象.我想要的是Mamals或Bird的类型.奇怪的是,如果我在动物 - >位置有一个元素然后我把它弄好了(Mamal/Bird),如果它没有元素那么我得到了基本类型.

如果我直接从AnimalHandler中的AnimalRepository获取所有动物的列表,我会相应地得到Mamals/Bird的对象.

编辑:Zoo对象

> db.zoo.findOne()
{
    "_id" : ObjectId("5822bd23085f753b5a5a2408"),
    "name" : "Zoo 2",
    "active" : true,
    "archived" : false,
    "animals" : [
        DBRef("animals", ObjectId("556cc7adec045b1a0c8b4567"),{ "$db": "tester", "discriminator": "Test\\Bundle\\Core\\Document\\Animal" }),
        DBRef("animals", ObjectId("556cb3b0ec045bbf068b4582"),{ "$db": "tester", "discriminator": "Test\\Bundle\\Core\\Document\\Animal" })
    ]
}
Run Code Online (Sandbox Code Playgroud)

肯定还有一些未显示的属性,因为它们无关紧要.

Has*_*san 0

我发现,如果我将一个实体保存为基类对象,它将返回基类的对象,因此在上面的示例中,如果我需要获得所需的结果,我必须适当地保存它。