我在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();
}
它有效。
谁能向我解释一下?
非常感谢。
父实体需要为其子实体提供其属性的可见性。
将$id属性可见性更改为"受保护"。
有点晚了,但也许它可以帮助其他人。
当你看一下教义生成的表定义时,你就会明白为什么会这样。 例如,我的帖子:
...
CONSTRAINT fk_5d9f75a1bf396750 FOREIGN KEY (id)
REFERENCES parent (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
...
如您所见,Doctrine 使用父表 id 作为子表 ID。就像@John卡特赖特说的那样,让你在父母中的$id受到保护。除此之外,仅在父级中定义吸气剂,一切正常。