gpt4 book ai didi

php - 在 Doctrine 2 的一个领域中处理多个关系

转载 作者:可可西里 更新时间:2023-11-01 13:55:14 25 4
gpt4 key购买 nike

我在 Doctrine 2 的一个字段中遇到了一个可能的多重关系的小问题。例如,我有一个 Article 实体,其中一个字段名为 author。此字段是 User 实体的 ManyToOne。但是,此字段也可以与 Group 实体相关。那么,我到底该如何创建这样的模式呢?

我考虑过创建一个名为 ArticleAuthor 的新实体,它有两个字段:usergroup,并且根据表单输入,我填充其中一个字段。这样,此表 ArticleAuthor 拥有它自己的 id 以及与正确表的正确关系。这是正确的做法吗?

最佳答案

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

等等

关于php - 在 Doctrine 2 的一个领域中处理多个关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12978075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com