在Doctrine 2中的一个字段中处理多个关系

vin*_*nux 5 php doctrine doctrine-orm

我在Doctrine 2中的一个字段中存在一个可能的多重关系的问题.例如,我有一个Article实体,其中一个字段被调用author.该字段是User实体的ManyToOne .但是,该字段也可以与Group实体相关.那么,我怎么能创建这样的架构?

我考虑创建一个新实体,称为ArticleAuthor有两个字段:usergroup,并根据表单输入,我填充其中一个字段.这样,该表ArticleAuthor保存了它自己id以及与正确表的正确关系.这是正确的方法吗?

Rob*_*ers 7

这就是所谓的多态关联.Doctrine能够使用继承映射来处理这些问题

所以你要定义你的基本实体,比如Author,然后你有一个GroupAuthor和一个UserAuthor都扩展它.这两者都需要配置为基本Author实体上的映射类.您是否选择单表或类表继​​承取决于您; 最终结果是一样的.

做的最后一件事是将关联UserAuthor实体的User实体,和你GroupAuthor对你的Group实体.

然后你可以像这样使用它:

$author = $article->getAuthor();
if ($author instanceof UserAuthor) {
    $user = $author->getUser();
} elseif ($author instanceof GroupAuthor) {
    $group = $author->getGroup();
    $users = $group->getUsers(); // Not sure if you'd need this?
}
Run Code Online (Sandbox Code Playgroud)

编辑:示例映射

'父母'实体, Author.php

/**
 * @ORM\Entity
 * @ORM\Table(name="authors")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap( {"user" = "UserAuthor", "group" = "GroupAuthor"} )
 */
class Author
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /* any other shared fields... */
}
Run Code Online (Sandbox Code Playgroud)

映射实体, UserAuthor.php

/**
 * @ORM\Entity
 * @ORM\Table(name="user_authors")
 */
class UserAuthor extends Author
{
    /* All columns unique to the UserAuthor entity... */
}
Run Code Online (Sandbox Code Playgroud)

等等