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)
等等
| 归档时间: |
|
| 查看次数: |
3855 次 |
| 最近记录: |