原则2文档示例中的拥有方和相反方是什么



在这个关联映射页面上,manytomy部分有一个示例。但我不知道哪个实体(组或用户)是拥有方。

http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#many-到许多双向

我也把代码放在这里了

<?php
/** @Entity */
class User
{
// ...
/**
* @ManyToMany(targetEntity="Group", inversedBy="users")
* @JoinTable(name="users_groups")
*/
private $groups;
public function __construct() {
$this->groups = new DoctrineCommonCollectionsArrayCollection();
}
// ...
}
/** @Entity */
class Group
{
// ...
/**
* @ManyToMany(targetEntity="User", mappedBy="groups")
*/
private $users;
public function __construct() {
$this->users = new DoctrineCommonCollectionsArrayCollection();
}
// ...
}

我是这样读这个注释的吗:用户是按组映射的,所以组是进行连接管理的实体,因此是拥有方?

此外,我在文档中读到了这一点:

For ManyToMany bidirectional relationships either side may be the owning side (the side  that defines the @JoinTable and/or does not make use of the mappedBy attribute, thus using   a default join table).

这让我认为User将是拥有方,因为JoinTable注释是在该实体中定义的。

但我不知道哪个实体(组或用户)是拥有方

User实体是所有者。用户:中有组的关系

/**
* @ManyToMany(targetEntity="Group", inversedBy="users")
* @JoinTable(name="users_groups")
*/
private $groups;

如上所述,$groupsvar包含与该用户关联的所有组,但如果注意到属性定义,则$groupsvar具有与mappedBy值相同的名称(mappedBy="groups"),正如您所做的:

/**
* @ManyToMany(targetEntity="User", mappedBy="groups")
*/
private $users;

mappedBy是什么意思

此选项指定作为此关系拥有方的targetEntity上的属性名称。

取自文档:

在一对一关系中,持有自身数据库表上的相关实体始终是关系。

在多对一关系中,多方默认为拥有方,因为它持有外键。关系的OneToMany一面是默认情况下是相反的,因为外键保存在"多"侧。A.OneToMany关系只能是拥有方,如果它已实现对联接表使用ManyToMany关系并限制该关系侧,每个数据库约束只允许UNIQUE值。

现在,我明白了很多人有时会感到困惑。

对于多对多关联,您可以选择哪个实体是拥有的,哪个实体是相反的一面。从开发人员的角度来看,有一个非常简单的语义规则来决定哪一方更适合作为拥有方。你只需要问问自己,哪个实体负责连接管理,并选择它作为拥有方。

以Article和Tag这两个实体为例。每当你想将文章连接到标签,反之亦然,主要是文章负责这种关系。每当您添加一篇新文章时,您都希望将其与现有或新标签连接起来。您的createArticle表单可能会支持这个概念,并允许直接指定标记。这就是为什么你应该选择文章作为拥有方,因为它使代码更容易理解:

<?php
class Article
{
private $tags;
public function addTag(Tag $tag)
{
$tag->addArticle($this); // synchronously updating inverse side
$this->tags[] = $tag;
}
}
class Tag
{
private $articles;
public function addArticle(Article $article)
{
$this->articles[] = $article;
}
}

这允许在关联的文章侧对添加的标签进行分组:

<?php
$article = new Article();
$article->addTag($tagA);
$article->addTag($tagB);

总之,任何对你更有意义的事情。您可以选择关系的所有权和反面。:)

来源:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

相关内容

  • 没有找到相关文章