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