我正在Zend应用程序中从Doctrine 1.1.4升级到Doctrine 2.0.6。
目前,我正在研究实体之间的关联映射。在Doctrine 2的Documentation中,它说'关系可能是双向的或单向的。我很困惑这些术语在给定的上下文中意味着什么。
如何确定关系是单向还是双向?
感谢帮助。
答案 0 :(得分:28)
如果两个实体都包含对另一个实体的引用,则该关系是双向的。
如果省略其中一个引用,则它是单向的。
考虑典型的“帖子”和“标签”架构。通常,您将实现双向关联:
<?php
class Post {
// ...
/**
* @ManyToMany(targetEntity="Tag",inversedBy="posts")
*/
protected $tags;
// ...
}
class Tag {
// ...
/**
* @ManyToMany(targetEntity="Post",mappedBy="tags")
*/
protected $posts
// ...
}
现在,想象一下你决定从来没有(或很少)需要回答“哪些帖子有标签'foo'?”等问题。您可以省略Tag实体中的$ posts关联,将其转换为单向关联,并从ORM中扣除一些负担。
您仍然可以回答这类问题,但您必须编写代码才能执行此操作。
事实上,它可能是一个很好的方式进入帖子/标签场景,因为你通常不会添加/删除标签中的帖子。通常,您只能在帖子中添加/删除标签。在寻找“带有标签'x'的所有帖子时,你只会从标签转到帖子”,这可以在某种服务类中轻松实现。
答案 1 :(得分:1)
与timdev的回答相同,
单向&amp; BiDirectional就是ORM Concepts,这些与数据库无关, 假设你有一个OneToMany关系 -
用户有博客
因此,您可以将此作为 OneToMany 属性
添加到您的用户实体但显然存在 ManyToOne 关系
博客有用户
因此您可以选择在博客实体中创建ManyToOne关系,如果您想从博客实体访问用户,那么如果您不想要添加此属性,则不要添加,这不是必需的。两个案例中的(您是否添加双向引用)ORM将维护相同的数据库结构(博客表将具有user_id列)。