在我开始之前,请注意我正在学习Symfony,所以请牢记这一点! 我只想理解它的工作原理。
这是我想要实现的:
我想使用Doctrine创建一个实体继承的工作crud示例。 这就是我的示例所看起来的样子:
- 抽象父类:character
- 子类1:Magician
- 子类2:Warrior
- 子类3:Archer
阅读了一些文档后,我决定使用Doctrine的STI(Single Table Inheritance)。
父类:
/**
* Character
*
* @ORM\Table(name="character")
* @ORM\Entity(repositoryClass="AppBundle\Repository\CharacterRepository")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"magician_db" = "Magician", "warrior_db" = "Warrior", "archer_db" = "Archer"})
*/
abstract class Character{
protected id;
protected name;
public function getId();
public function getName();
public function setName();
}
子类 1:
class Warrior extends Character{
protected armor;
public function battleShout();
}
子类2:
class Magician extends Character{
protected silk;
public function spellAnnounce();
}
Child Class 3:
class Archer extends Character{
protected leather;
public function arrows();
}
我已经成功在我的数据库中创建了表,并为测试目的成功加载了我的固定装置。我还使我的主视图工作(列出所有字符)。
我的问题: 现在我想能够使用单个表单创建、编辑和删除列表中的特定字符。例如,我将有一个'类型'选择字段,可以选择'战士'、'魔法师'或'弓箭手',然后我将能够填写所选实体的特定字段。所以,假设我在表单中选择了“战士”,那么我希望能够设置盔甲属性(当然还有父级属性),并将其保存在数据库中。
因为我的父类是抽象的,所以我不知道该如何做,因此无法根据该对象创建表单。
提前感谢您的帮助,我真的需要它! 附注:如果有更好的解决方案/实现,请不要犹豫!
abstract
或者不使用完全迷失了方向。使用ParentType()
、Child1Type()
或者Child2Type()
来创建表单等等。我在Stack Overflow上搜索了很久,但没有人公布结果,这真的很令人沮丧。由于关于这个主题存在如此多的帖子,我不想再开一个新的帖子。 - Delphine