这就是所谓的多态关联。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