Странное исключение Doctrine ODM при использовании ссылок вместе с наследованием

У меня три класса. File-Class имеет ссылку на Foobar, а Game наследует от Foobar. Есть и другие классы, которые также наследуются от Foobar, но я их не упомянул, так как они здесь неуместны. Я также пропустил некоторые нерелевантные поля и их геттеры и сеттеры.

План состоит в том, что каждая игра имеет два изображения, основное изображение и вторичное изображение. Я поместил эти поля в отдельный класс, от которого наследует Game, потому что они мне нужны и для нескольких других классов.

Моя проблема в том, что если я загружаю игры из базы данных, как только я пытаюсь их перебрать, я получаю следующее исключение:

Примечание: Неопределенный индекс: в C:\xampp\htdocs\Symfony\vendor\doctrine\mongodb-odm\lib\Doctrine\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
    }

Это ошибка в Doctrine ODM или я что-то не так делаю? Классы правильные? Я пробовал все, но это просто не работает.


person Gigala    schedule 06.05.2014    source источник


Ответы (1)


Я думаю, что уже слишком поздно для вашего вопроса, но, возможно, есть другие пользователи, у которых такая же проблема (как у меня).

Проблема связана с тем, что Foobar является MappedSuperclass. Была та же проблема, что описана вами и на https://github.com/doctrine/mongodb-odm/issues/241.

Решение состоит в том, чтобы ссылаться не на абстрактный класс Foobar (= MappedSuperclass), а на конкретную реализацию (= Document) - как в вашем случае - Game.

См. также Doctrine ODM возвращает прокси объект для базового класса вместо документа подкласса

person Tobias    schedule 06.08.2015
comment
Спасибо за ответ! Я не ожидал, что кто-то ответит после того, как прошло так много времени. Я не могу попробовать это прямо сейчас, но если я найду время, я обязательно проверю это! - person Gigala; 10.08.2015