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

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

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

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

感谢您的帮助。


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


推荐