vin*_*nux 5 php doctrine doctrine-orm
我在Doctrine 2中的一个字段中存在一个可能的多重关系的问题.例如,我有一个Article
实体,其中一个字段被调用author
.该字段是User
实体的ManyToOne .但是,该字段也可以与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?
}
Run Code Online (Sandbox Code Playgroud)
'父母'实体, 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... */
}
Run Code Online (Sandbox Code Playgroud)
映射实体, UserAuthor.php
/**
* @ORM\Entity
* @ORM\Table(name="user_authors")
*/
class UserAuthor extends Author
{
/* All columns unique to the UserAuthor entity... */
}
Run Code Online (Sandbox Code Playgroud)
等等