具有预定义和用户定义选项的复杂主义实体

时间:2018-03-07 21:18:03

标签: php symfony doctrine

很抱歉,如果标题无效,则无法考虑如何调用该问题。我正在寻找一种方法来构建我的Doctrine实体。我正在尝试为我和我的朋友们写一个D& D角色表程序,我目前正在努力学习的是语言。

字符有已知的语言。

角色的种族通常为角色定义一种已知语言。

角色的背景通常可以选择学习其他多种语言。

有没有一种体面的方式让Doctrine处理这些关系?我希望将各个语言存储为自己的实体。

所以:

字符表实体

  • 已知语言的总列表
  • 种族实体

    • 具有预定义的已知语言。
  • 后台实体

    • 拥有可变数量的用户选择语言。

我在想的是一个他们可以扩展的LanguageModifier类,如果其他东西需要修改已知的语言,这将允许以后的灵活性,我只是难以可视化关系。

2 个答案:

答案 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;

...