2

我在 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;
   }
}

当我坚持子对象,刷新然后我尝试检索子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();
}

有用。

谁能给我解释一下?

非常感谢。

4

2 回答 2

3

父实体需要向其子实体提供其属性的可见性。

将您的 $id 属性可见性更改为“受保护”。

于 2013-10-08T17:57:16.040 回答
1

有点晚了,但也许它可以帮助其他人。

当您查看 Doctrine 生成的表定义时,您会明白为什么会这样。例如我在 postgres 中的:

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

如您所见,Doctrine 为您的子表 id 使用父表的 id。就像@John Cartwright 所说,让你的 $id 在父母中受到保护。除此之外,仅在父级中定义吸气剂,一切正常。

于 2014-07-19T11:53:33.167 回答