我在Doctrine 2中的一个字段中可能存在多个关系时遇到一些问题。例如,我有一个Article
实体,其中一个字段名为author
。该字段是User
实体的ManyToOne。但是,该字段也可以与Group
实体相关。那么,我怎么能创建这样的架构?
我考虑过创建一个名为ArticleAuthor
的新实体,它有两个字段:user
和group
,根据表单输入,我填充其中一个字段。这样,此表ArticleAuthor
拥有它自己的id
以及与正确表格的正确关系。这是正确的做法吗?
答案 0 :(得分:7)
这就是所谓的多态关联。 Doctrine能够使用Inheritance Mapping
处理这些问题所以你要定义你的基本实体,例如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
/**
* @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... */
}
等