在这个关联映射页面上,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;
如上所述,$groups
var包含与该用户关联的所有组,但如果注意到属性定义,则$groups
var具有与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