教义2 doc示例中的拥有方和反向方是什么

2022-08-31 00:38:58

在关联映射的此页面上,manytomany 部分有一个示例。但我不明白哪个实体(组或用户)是拥有方。

http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#many-to-many-bidirectional

我也把代码放在这里

<?php
/** @Entity */
class User
{
    // ...

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

    public function __construct() {
        $this->groups = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

/** @Entity */
class Group
{
    // ...
    /**
     * @ManyToMany(targetEntity="User", mappedBy="groups")
     */
    private $users;

    public function __construct() {
        $this->users = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

我是否像这样阅读此注释:用户是映射的按组,因此组是执行连接管理的实体,因此是拥有方?

另外,我已经在文档中读到了这个:

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注释是在该实体中定义的。


答案 1

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

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

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

如上所示,var 包含与此用户关联的所有组,但如果您注意到属性定义,var 具有相同的值名称 (mappedBy=“”),就像您所做的那样:$groups$groupsmappedBygroups

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

mappedBy是什么意思?

此选项指定作为此关系所属方的目标实体上的属性名称。


答案 2

摘自文档:

在一对一关系中,在其自己的数据库表上持有相关实体的外键的实体始终是关系的拥有方。

在多对一关系中,默认情况下,多方是拥有方,因为它持有外键。默认情况下,关系的 OneToMany 端是反向的,因为外键保存在 Many 端。如果 OneToMany 关系使用与联接表的 ManyToMany 关系实现,并且将一端限制为每个数据库约束仅允许 UNIQUE 值,则 OneToMany 关系只能是拥有方。

现在,我知道ManyToMany有时会令人困惑。

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

以两个实体“文章”和“标记”为例。每当您想将文章连接到标签时,反之亦然,主要是文章负责这种关系。每当添加新文章时,您都希望将其与现有或新标签连接。您的 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


推荐