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

时间:2012-10-19 15:59:26

标签: php doctrine doctrine-orm

我在Doctrine 2中的一个字段中可能存在多个关系时遇到一些问题。例如,我有一个Article实体,其中一个字段名为author。该字段是User实体的ManyToOne。但是,该字段也可以与Group实体相关。那么,我怎么能创建这样的架构?

我考虑过创建一个名为ArticleAuthor的新实体,它有两个字段:usergroup,根据表单输入,我填充其中一个字段。这样,此表ArticleAuthor拥有它自己的id以及与正确表格的正确关系。这是正确的做法吗?

1 个答案:

答案 0 :(得分:7)

这就是所谓的多态关联。 Doctrine能够使用Inheritance Mapping

处理这些问题

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

要做的最后一件事是将UserAuthor实体与您的User实体以及GroupAuthorGroup实体相关联。

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

$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?
}

编辑:示例映射

“父”实体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... */
}

映射实体UserAuthor.php

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