Наследование Symfony2-Doctrine2 не работает должным образом

У меня есть проект на Symfony 2.3, использующий Doctrine ORM 2.3.4, и я использую наследование классов:

родительский класс

/**
 * @ORM\Entity
 * @ORM\Table(name="parent")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"child"="Child"})
 */
class Parent
{
   /**
    * @ORM\Column(name="id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
   private $id;

   public function getId()
   {
      return $this->id;
   }

   // other fields & methods
}

и детский

/**
 * @ORM\Entity
 * @ORM\Table(name="child")
 */
class Child extends Parent
{
   /**
    * @ORM\Column(name="id", type="integer")
    * @ORM\Id
    */
   private $id;

   public function getId()
   {
      return $this->id;
   }
}

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

// ChildController::createAction

$em = $this->getDoctrine()->getManager();
$child = new Child();
// set child fields
$em->persist($child);
$em->flush();

$child->getId(); // <- not working

В базе данных дочерняя строка сохраняется правильно, и если я изменю дочерний метод getId

public function getId()
{
   return parent::getId();
}

оно работает.

Кто-нибудь может объяснить мне это?

Большое спасибо.


person Enoah Netzach    schedule 29.09.2013    source источник


Ответы (2)


Родительский объект должен предоставлять видимость своих свойств своим дочерним элементам.

Измените видимость свойства $id на «защищено».

person John Cartwright    schedule 08.10.2013

Это немного поздно, но, возможно, это поможет другим.

Когда вы взглянете на определение своей таблицы, сгенерированное Doctrine, вы поймете, почему это так. Например. мой в постгресе:

...
CONSTRAINT fk_5d9f75a1bf396750 FOREIGN KEY (id)
      REFERENCES parent (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE
...

Как видите, Doctrine использует для идентификатора вашей дочерней таблицы идентификатор родителя. Как сказал @John Cartwright, сделайте свой $id в родительском защищенным. В дополнение к этому определите геттер только в родительском, и все работает просто отлично.

person kinske    schedule 19.07.2014