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

时间:2016-12-20 14:14:37

标签: php mongodb symfony doctrine

我正在尝试从MongoDB中检索对象,但是我遇到的问题是它返回基类型的元素而不是子元素而且它引起了麻烦,我发现它在某种程度上依赖于属性的值。 / p>

var activityClass: Class<out BaseActivity> = MainActivity::class.java

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

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

EDITED: Zoo对象

/**
 * @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
{

}

当然,还有一些未显示的属性,因为它们无关紧要。

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您需要PHP的内置get_class()get_called_class()功能。

注意:对象本身不应该忘记它们属于哪个类,即使它们是由只有&#34;知道&#34;的函数/方法返回的。他们正在返回一些超类或其子类的实例。因此,您应始终能够通过get_class($instance)函数查询实例所属的类。

答案 1 :(得分:0)

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