【发布时间】:2012-07-29 12:26:57
【问题描述】:
我创建了一个继承的文档类,见下面的代码。文档可以正常保存,但是在获取文档并尝试调用子函数时,我会收到错误 Call to undefined method Proxies__CG__\Acme\ProductBundle\Document\ProductBase::getPriceDefinition() 甚至是孩子文档具有 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') 调用,还是我的继承定义...
【问题讨论】: