学说 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;
mappedBy 是什么意思?
此选项指定作为此关系拥有方的 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 文档示例中的拥有方和反方是啥的主要内容,如果未能解决你的问题,请参考以下文章
在学说-mongodb 中的 preUpdate 事件时创建/保留新文档