我在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();
}
它有效。
有人可以向我解释一下吗?
非常感谢。
答案 0 :(得分:3)
父实体需要向其子项提供其属性的可见性。
将您的$ id属性可见性更改为“protected”。
答案 1 :(得分:1)
有点晚了,但也许有助于其他人。
当你看一下Doctrine生成的表定义时,你就会明白为什么会这样。例如。我在postgres:
...
CONSTRAINT fk_5d9f75a1bf396750 FOREIGN KEY (id)
REFERENCES parent (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
...
如您所见,Doctrine为您的子表id使用父ID的id。 就像@John Cartwright所说的那样,让你在父母身上的$ id受到保护。 除此之外,只在父级中定义getter,一切正常。