【问题标题】:How to determine if a table relationship is bidirectional or unidirectional in Doctrine 2?在 Doctrine 2 中如何确定表关系是双向的还是单向的?
【发布时间】:2011-10-03 12:26:30
【问题描述】:

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

目前,我正在研究实体之间的关联。在教义 2 的Documentation 中,它说“关系可能是双向的或单向的。我对这些术语在给定上下文中的含义感到困惑。

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

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    如果两个实体都包含对另一个的引用,则关系是双向的。

    如果您省略其中一个引用,则它是单向的。

    考虑一个典型的“帖子”和“标签”架构。通常,您会实现双向关联:

    <?php
    
    class Post {
        // ...
    
        /** 
         * @ManyToMany(targetEntity="Tag",inversedBy="posts")
         */
         protected $tags;
    
        // ...
    }
    
    class Tag {
        // ...
    
        /**
         * @ManyToMany(targetEntity="Post",mappedBy="tags")
         */
         protected $posts
    
        // ...
    }
    

    现在,假设您决定从不(或很少)需要回答诸如“哪些帖子有标签 'foo'?”之类的问题。您可以在 Tag 实体中省略 $posts 关联,将其转换为单向关联,并减轻 ORM 的一些负担。

    您仍然可以回答这类问题,但您必须编写代码才能做到这一点。

    事实上,这可能是在帖子/标签方案中使用的好方法,因为您通常不会从标签中添加/删除帖子。通常,您只会在帖子中添加/删除标签。在查找“所有带有标签'x'的帖子”时,您只会从标签转到帖子,这可以在某种服务类中轻松实现。

    【讨论】:

    • 哇,简单的解释但足够清楚让我们理解这个概念。
    • 非常感谢先生!
    【解决方案2】:

    和 timdev 的回答一样,

    单向和双向只是ORM的概念,这些与数据库无关, 假设你有一个 OneToMany 关系 -

    用户有博客

    因此,您可以将其作为 OneToMany 属性添加到您的用户实体中

    但显然存在 ManyToOne 关系

    博客有用户

    所以您可以选择在您的博客实体中创建多对一关系,如果您想从博客实体访问用户,请添加此属性,如果您不想要则不要添加,它不是必需的。 在这两种情况下(您是否添加双向引用)ORM 将保持相同的数据库结构(博客表将具有 user_id 列)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 2011-07-18
      • 2011-02-09
      相关资源
      最近更新 更多