Doctrine 2中的关联关系

4

我不太明白Doctrine中的关联。我想知道单向关系和双向关系之间的区别,以及Doctrine 2中的拥有方和反向方是什么。

1个回答

15

双向和单向关系

双向和单向是关于您的PHP对象中的引用的。

正如这里所示,单向和双向引用的数据库模式实际上是相同的。区别在于:

  • 单向:A类对象引用B类对象,但反之不成立。
  • 双向:A类对象引用B类对象,同时B类对象也引用A类对象。

反向和拥有方

拥有方和反向方的概念是关于将对象模型更改持久化到数据库中。这里是详细的解释。

简而言之,Doctrine 2不会跟踪对象模型中的更改。假设您有两个类:ParentChild。类Parent具有集合children。类Child具有引用parent。以下代码将使您的数据模型不一致:

$parent = new Parent();
$child = new Child();
$parent->children->add($child);

在实体类中使用公共属性是一个不好的想法,也是不被鼓励的,但出于演示目的,这样做是可以的。因此,以下代码将$child添加到$parent中,但不设置$child->parent。领域模型变得不一致(这就是为什么Doctrine手册建议将关联逻辑封装到实体模型中),但仍然可以将这些对象持久化到数据库中。
这就是拥有和反向方面概念变得重要的地方。Doctrine将根据owning side状态持久化实体关系。因此,在我们的例子中,$parent=>$child关系将是:
  • 如果拥有方是Parent类,则持久化
  • 如果拥有方是Child类,则忽略
请注意,拥有方用inversedBy关系注释进行标记。
有一个建议选择拥有和反向方面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接