我创建了一个继承的文档类,请参见下面的代码。文档可以正常保存,但是在获取文档并尝试调用子函数时,即使子文档具有 getPriceDefinition() 函数,我也会收到错误Call to undefined method Proxies__CG__\Acme\ProductBundle\Document\ProductBase::getPriceDefinition () 函数。代理也指向 ProductBase,而不是 SimpleProduct。
父类 ProductBase.php
<?php
namespace Acme\ProductBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\Document
* @MongoDB\InheritanceType("SINGLE_COLLECTION")
* @MongoDB\DiscriminatorField(fieldName="type")
* @MongoDB\DiscriminatorMap({"simple"="SimpleProduct"})
*/
abstract class ProductBase
{
/**
* @MongoDB\Id;
*/
protected $_id;
/**
* @MongoDB\String
*/
public $comment;
}
子类 SimpleProduct.php
<?php
namespace Acme\ProductBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\Document
*/
class SimpleProduct extends ProductBase
{
/**
* @var PriceDefinition
* @MongoDB\EmbedOne(targetDocument="PriceDefinition")
*/
protected $priceDefinition;
public function getPriceDefinition() {
return $this->priceDefinition;
}
}
调用代码(仅部分):
$product = $this->dm->getRepository('AcmeProductBundle:Product')->findOneBy(array('_id' => $productId));
$priceDefinition = $product->getPriceDefinition(); // The error is thrown here
最后是数据库中的文档(即与上述文档正确持久化)。
{
"_id": ObjectId("5006d7b76803fa9403000007"),
"priceDefinition": {
"referenceValue": 1000000,
"currency": "iso: EUR",
"taxBehavior": "fi_vat_a",
"isGrossPrice": false
},
"type": "simple"
}
一般来说,这似乎 Doctrine 不会识别返回的对象是子类。但是-例如,如果我将数据库类型值更改为与 DiscriminatorMap 不匹配的“简单”(例如“非简单”)以外的其他值,则该学说会显示“注意:未定义索引:非简单(... )”。
最奇怪的是,只要我在父类 (ProductBase) 中添加 getPriceDefinition(),它就会被正确调用且没有错误。
呃……这是一个很长的问题。无论如何,我只是无法找出这里有什么问题。是我的 getRepository('AcmeProductBundle:Product') 调用,还是我的继承定义......