5

我在 Doctrine 2 的一个字段中可能存在多重关系时遇到了一点问题。例如,我有一个Article实体,其中一个字段名为author. 此字段是实体的多对一User。但是,该字段也可以与Group实体相关。那么,我怎么能创建这样的模式呢?

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

4

1 回答 1

7

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

因此,您将定义您的基本实体,例如Author,然后您将拥有 aGroupAuthor和 a 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?
}

编辑:示例映射

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

ETC

于 2012-10-19T16:15:08.803 回答