Symfony 将引用与继承一起使用时出现ODM异常
我有三节课。File类引用了Foobar,游戏继承自Foobar。还有一些其他类也继承自Foobar,但我把它们遗漏了,因为它们在这里不相关。我还漏掉了一些不相关的领域和它们的接受者和接受者 计划是每个游戏有两个图像,主图像和第二图像。我把这些字段放在了一个单独的类中,游戏继承了这个类,因为我还需要其他一些类使用它们 我的问题是,如果我在尝试迭代时立即从数据库加载游戏,则会出现以下异常: 注意:未定义的索引:在C:\xampp\htdocs\Symfony\vendor\doctor\mongodb-odm\lib\doctor\odm\mongodb\Mapping\ClassMetadataInfo.php第1293行 以下是ClassMetadataInfo.php的行供参考Symfony 将引用与继承一起使用时出现ODM异常,symfony,inheritance,doctrine-odm,Symfony,Inheritance,Doctrine Odm,我有三节课。File类引用了Foobar,游戏继承自Foobar。还有一些其他类也继承自Foobar,但我把它们遗漏了,因为它们在这里不相关。我还漏掉了一些不相关的领域和它们的接受者和接受者 计划是每个游戏有两个图像,主图像和第二图像。我把这些字段放在了一个单独的类中,游戏继承了这个类,因为我还需要其他一些类使用它们 我的问题是,如果我在尝试迭代时立即从数据库加载游戏,则会出现以下异常: 注意:未定义的索引:在C:\xampp\htdocs\Symfony\vendor\doctor\mongo
public function getPHPIdentifierValue($id)
{
$idType = $this->fieldMappings[$this->identifier]['type'];
return Type::getType($idType)->convertToPHPValue($id);
}
这是我的课程
文件类:
namespace Project\MainBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\Document
*/
class File
{
/**
* @MongoDB\Id(strategy="INCREMENT")
*/
protected $id;
/**
* @MongoDB\ReferenceOne(targetDocument="Foobar", inversedBy="mainImage")
*/
private $mainImage;
/**
* @MongoDB\ReferenceOne(targetDocument="Foobar", inversedBy="secondaryImage")
*/
private $secondaryImage;
/**
* Get id
*/
public function getId()
{
return $this->id;
}
public function setMainImage($mainImage)
{
$this->mainImage = $mainImage;
return $this;
}
public function getMainImage()
{
return $this->mainImage;
}
public function setSecondaryImage($secondaryImage)
{
$this->secondaryImage = $secondaryImage;
return $this;
}
public function getSecondaryImage()
{
return $this->secondaryImage;
}
}
Foobar类:
namespace Project\MainBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\MappedSuperclass
*/
abstract class Foobar
{
/**
* @MongoDB\Id(strategy="INCREMENT")
*/
protected $id;
/**
* @MongoDB\ReferenceOne(targetDocument="File", mappedBy="mainImage")
*/
protected $mainImage;
/**
* @MongoDB\ReferenceOne(targetDocument="File", mappedBy="secondaryImage")
*/
protected $secondaryImage;
/**
* Get id
*/
public function getId()
{
return $this->id;
}
/**
* Set mainImage
*/
public function setMainImage($file)
{
$file->setMainImage($this);
$this->mainImage = $file;
return $this;
}
/**
* Get mainImage
*/
public function getMainImage()
{
return $this->mainImage;
}
/**
* Set secondaryImage
*/
public function setSecondaryImage($file)
{
$file->setSecondaryImage($this);
$this->secondaryImage = $file;
return $this;
}
/**
* Get secondaryImage
*/
public function getSecondaryImage()
{
return $this->secondaryImage;
}
}
游戏类别:
namespace Project\MainBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\Document
*/
class Game extends Foobar
{
/**
* @MongoDB\String
*/
private $name;
/**
* Set name
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*/
public function getName()
{
return $this->name;
}
}
虽然这并不重要,但我想执行以下功能:
$dm = $this->get('doctrine_mongodb')->getManager();
$games_all = $dm->getRepository("ProjectMainBundle:Game")->createQueryBuilder()->sort('id', 'ASC')->getQuery()->execute();
foreach ($games_all as $singlegame) { // it breaks here
// Here i would do stuff
}
这是ODM理论中的一个缺陷还是我做错了什么?课程是否正确?我什么都试过了,但都没用。我觉得现在回答你的问题已经太迟了,但可能还有其他用户(和我一样)也有同样的问题 这个问题与Foobar是MappedSuperclass有关。与您和在描述的问题相同 解决方案是不引用抽象类Foobar(=MappedSuperclass),而是引用一个具体的实现(=Document)——就像您的案例一样——游戏
另请参见谢谢您的回答!这么长时间过去了,我没想到会有人回答。我现在不能尝试,但如果我有时间,我肯定会去看看!