1

我试图找出在 Doctrine 2 中定义我的实体的最佳方法,但没有任何解决方案真正感觉正确。我可能会从错误的角度进行此操作,因此非常感谢指针。

问题在于为用户和一个或多个配置文件定义实体。现在,我有当前的设置:

用户

/**
 * @ORM\Entity
 */
class User {
    use AutoIdentifiable; //Trait for auto-generating an @id.

    /**
     * @ORM\OneToMany(targetEntity="UserProfile", mappedBy="user", cascade={"all"}, fetch="EAGER", orphanRemoval=TRUE)
     * @var UserProfile
     */
    protected $profiles;    
}

用户资料

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"personalprofile" = "PersonalProfile", "companyprofile" = "CompanyProfile"})
 */
abstract class UserProfile {
    use AutoIdentifiable;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="profiles", fetch="EAGER")
     * @var User
     */
    protected $user;
}

个人资料

/**
 * @ORM\Entity
 */
class PersonalProfile extends UserProfile {
    /**
     * @ORM\Column(length=50)
     * @var String
     */
    protected $firstName;

    /**
     * @ORM\Column(length=50)
     * @var String
     */
    protected $lastName;
}

公司简介

/**
 * @ORM\Entity
 */
class CompanyProfile extends UserProfile {

    /**
     * @ORM\Column
     * @var String
     */
    protected $name;

    /**
     * @ORM\Column(length=9)
     * @var String
     */
    protected $orgNr;
}

如您所见,一个用户可以拥有一个或多个包含非常不同信息的配置文件。如果我决定继续使用这种设计,我可能会在稍后添加更多配置文件,具体取决于用户拥有的角色。(例如,如果用户有一个个人博客,他们可能有一个 BlogProfile,其中包含一张图片和一些关于他们自己的描述。)

问题是加载和检查特定配置文件非常笨拙,用户甚至可能拥有配置文件组合。(例如:个人+博客)似乎也不是一个好主意,只是对每个特定的配置文件都有一个命名的引用。我确实检查了装饰器模式,但我不确定它是否合适。

问题是:

  1. 我是否缺少适合这种结构的设计模式?
  2. 也许有更好的方法来解决整个问题?
  3. 有没有人对这些类型的数据结构有经验并且可以分享一些有用的提示?
4

1 回答 1

0

我自己还没有实现它,但我想你可以看看 ResolveTargetEntityListener 在教义中是如何使用的:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/resolve-target-entity-listener.html

于 2014-02-18T19:49:49.653 回答