php - 从 MongoDB 获取 Child 类型而不是 parent 类型的对象

标签 php mongodb symfony doctrine

我正在尝试从 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
{

}

问题是:当我从 ZooHandler 调用 getAnimals() 时,它返回 Animal 类型的对象。我想要的是哺乳动物或鸟类的类型。 奇怪的是,如果我在 Animals->location 中有一个元素,那么我得到的是正确的(Mamal/Bird),如果它没有该元素,那么我得到的是基本类型。

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

编辑: 动物园对象

> 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" })
    ]
}

肯定还有一些属性没有显示,因为它们不相关。

最佳答案

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

注意:对象本身不应该忘记它们属于哪个类,即使它们是由一个只“知道”它们返回父类(super class)的某个实例或一个函数/方法返回的它的子类。因此,您应该始终能够通过 get_class($instance) 查询实例属于哪个类。功能。

关于php - 从 MongoDB 获取 Child 类型而不是 parent 类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41244373/

相关文章:

php - 编写用于 iPhone、Android 和 Windows Phone 应用程序的 SOAP 与 RESTFUL Web 服务

javascript - 存储用户敏感 API 详细信息的安全方式(本地存储还是数据库?)

java - 如何使用 MongoDB Java 创建事务?

java - Spring Data Mongo @Column 等效注解(@Property?)

symfony - 学说 : select a table that is not managed by doctrine

php - FOS 用户包认证

javascript - 大数据解析哪个好

java - 使用套接字时如何处理消息被破坏的情况?

javascript - Mongoose 对象的键与属性名称不同

angularjs - 过期的 JWT token - 如何刷新 token