学说 2 文档示例中的拥有方和反方是啥

Posted

技术标签:

【中文标题】学说 2 文档示例中的拥有方和反方是啥【英文标题】:What is the owning side and inverse side in the doctrine 2 doc example学说 2 文档示例中的拥有方和反方是什么 【发布时间】:2012-11-12 15:12:35 【问题描述】:

在关联映射的这个页面上,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 注释是在该实体中定义的。

【问题讨论】:

这个***.com/questions/12493865/…的可能副本 【参考方案1】:

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

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

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

看上面,$groups var 包含与该用户关联的所有组,但如果您注意到属性定义,$groups var 具有 同名mappedBy 值(mappedBy= "groups"),就像你做的那样:

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

ma​​ppedBy 是什么意思?

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

【讨论】:

【参考方案2】:

取自文档:

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

在多对一关系中,默认情况下多方是拥有方, 因为它拥有外键。关系的 OneToMany 方面是 默认情况下是反向的,因为外键保存在多端。一种 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

【讨论】:

感谢您的回复。我了解您从文档中获取的内容 .. 但在这篇文章标签示例中。你应该把 mappedBy 属性放在哪里?请问可以加注解吗?谢谢 :) 我第二个@mattyh88 建议。 很久很久以后来这里说:owning 端可选地具有inversedBy 属性(如果它是双向关系,则它是必需的 - 如果它是多对多单向关系,您不使用inversedBy)。如果您处于双向关系中,则反面 总是 具有 mappedBy 属性。 确实提示选择哪个实体拥有方!

以上是关于学说 2 文档示例中的拥有方和反方是啥的主要内容,如果未能解决你的问题,请参考以下文章

ORM 映射中的“拥有方”是啥?

arcmap 是啥中了?做啥用的?

在学说-mongodb 中的 preUpdate 事件时创建/保留新文档

Symfony2 和空关系的学说

从嵌套在 Firestore 文档中的集合中获取数据的最佳方法是啥?

统计中的F、 P、 r、 R平方各是啥意思?