我在教义 2 中一个字段中可能存在多重关系时遇到了一个小问题。例如,我有一个Article
实体,其中包含一个名为author
的字段。此字段是User
实体的多对一。但是,此字段也可以与Group
实体相关。那么,我到底该如何创建这样的架构呢?
我考虑过创建一个名为ArticleAuthor
的新实体,它有两个字段:user
和group
,并根据表单输入填充其中一个字段。这样,此表ArticleAuthor
保存自己的id
以及与正确表的正确关系。这是一种正确的方法吗?
这就是所谓的多态关联。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?
}
编辑:示例映射
"父"实体Author.php
/**
* @ORMEntity
* @ORMTable(name="authors")
* @ORMInheritanceType("JOINED")
* @ORMDiscriminatorColumn(name="type", type="string")
* @ORMDiscriminatorMap( {"user" = "UserAuthor", "group" = "GroupAuthor"} )
*/
class Author
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/* any other shared fields... */
}
映射实体,UserAuthor.php
/**
* @ORMEntity
* @ORMTable(name="user_authors")
*/
class UserAuthor extends Author
{
/* All columns unique to the UserAuthor entity... */
}
等