很抱歉,如果标题无效,则无法考虑如何调用该问题。我正在寻找一种方法来构建我的Doctrine实体。我正在尝试为我和我的朋友们写一个D& D角色表程序,我目前正在努力学习的是语言。
字符有已知的语言。
角色的种族通常为角色定义一种已知语言。
角色的背景通常可以选择学习其他多种语言。
有没有一种体面的方式让Doctrine处理这些关系?我希望将各个语言存储为自己的实体。
所以:
字符表实体
种族实体
后台实体
我在想的是一个他们可以扩展的LanguageModifier类,如果其他东西需要修改已知的语言,这将允许以后的灵活性,我只是难以可视化关系。
答案 0 :(得分:0)
您的问题对于Stack Overflow而言过于宽泛;)
是的,你可以在学说中定义这些关系。
我会使用语言实体。
Race <--> Language (default language(s) of race)
Background <--> languages (default languages of background)
您可以使用getLanguages获取这两种关系的语言,并将它们合并到一个数组中。
或者您可以添加关系
Character <--> Languages (mastered languages)
允许您添加/删除语言以进行更多自定义。在这种情况下,当您添加Race / Background时,它只会将其默认语言添加到角色的语言集合中。
答案 1 :(得分:0)
好的,我正在寻找的是覆盖字段关联映射:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/override-field-association-mappings-in-subclasses.html
所以我选择了一个特性,实体可以用来声明他们要修改字符语言:
...
trait CharacterLanguageModifier
{
/**
* @var bool
*/
protected $isCharacterLanguageModifier = true;
/**
* @ORM\ManyToMany(targetEntity="CharacterLanguage")
*
* @var ArrayCollection
*/
protected $definedLanguages;
/**
* @ORM\Column(type="integer", length=8)
*
* @var int
*/
protected $numUndefinedLanguages;
...
然后在CharacterRace实体中,使用AssociationOverride确保它获得它自己的唯一表:
...
* @ORM\Entity()
* @ORM\AssociationOverrides({
* @ORM\AssociationOverride(name="definedLanguages",
* joinTable=@ORM\JoinTable(
* name="character_race_languages_defined"
* )
* )
* })
*/
class CharacterRace
{
use CharacterAttributeModifier,
CharacterLanguageModifier;
...