如何确定Doctrine 2中的表关系是双向还是单向?

时间:2011-07-12 10:33:43

标签: php zend-framework mapping models doctrine-orm

我正在Zend应用程序中从Doctrine 1.1.4升级到Doctrine 2.0.6。

目前,我正在研究实体之间的关联映射。在Doctrine 2的Documentation中,它说'关系可能是双向的或单向的。我很困惑这些术语在给定的上下文中意味着什么。

如何确定关系是单向还是双向?

感谢帮助。

2 个答案:

答案 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列)。