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