在doctrine 2 doc示例中,拥有方和反方是什么

时间:2012-11-12 15:12:36

标签: php doctrine-orm

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

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).

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

2 个答案:

答案 0 :(得分:15)

取自文档:

  

以一对一的关系持有外键的实体   自己的数据库表上的相关实体始终是拥有者   关系。

     

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

现在,我了解ManyToMany有时会让人感到困惑。

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

以两个实体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;
    }
}

这允许在关联的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

答案 1 :(得分:15)

  

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

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

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

如上所示,$groups var包含与此用户关联的所有组,但如果您注意到属性定义,$groups var的{strong>同名为{{1 } value(mappedBy =“mappedBy”),就像你做的那样:

groups

mappedBy是什么意思?

  

此选项指定targetEntity上属性名称,该属性是此关系的拥有方。