Symfony 将引用与继承一起使用时出现ODM异常

Symfony 将引用与继承一起使用时出现ODM异常,symfony,inheritance,doctrine-odm,Symfony,Inheritance,Doctrine Odm,我有三节课。File类引用了Foobar,游戏继承自Foobar。还有一些其他类也继承自Foobar,但我把它们遗漏了,因为它们在这里不相关。我还漏掉了一些不相关的领域和它们的接受者和接受者 计划是每个游戏有两个图像,主图像和第二图像。我把这些字段放在了一个单独的类中,游戏继承了这个类,因为我还需要其他一些类使用它们 我的问题是,如果我在尝试迭代时立即从数据库加载游戏,则会出现以下异常: 注意:未定义的索引:在C:\xampp\htdocs\Symfony\vendor\doctor\mongo

我有三节课。File类引用了Foobar,游戏继承自Foobar。还有一些其他类也继承自Foobar,但我把它们遗漏了,因为它们在这里不相关。我还漏掉了一些不相关的领域和它们的接受者和接受者

计划是每个游戏有两个图像,主图像和第二图像。我把这些字段放在了一个单独的类中,游戏继承了这个类,因为我还需要其他一些类使用它们

我的问题是,如果我在尝试迭代时立即从数据库加载游戏,则会出现以下异常:

注意:未定义的索引:在C:\xampp\htdocs\Symfony\vendor\doctor\mongodb-odm\lib\doctor\odm\mongodb\Mapping\ClassMetadataInfo.php第1293行

以下是ClassMetadataInfo.php的行供参考

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)——就像您的案例一样——游戏


另请参见

谢谢您的回答!这么长时间过去了,我没想到会有人回答。我现在不能尝试,但如果我有时间,我肯定会去看看!