【发布时间】:2011-10-03 12:26:30
【问题描述】:
我正在我的 Zend 应用程序中从 Doctrine 1.1.4 升级到 Doctrine 2.0.6。
目前,我正在研究实体之间的关联。在教义 2 的Documentation 中,它说“关系可能是双向的或单向的。我对这些术语在给定上下文中的含义感到困惑。
如何确定关系是单向的还是双向的?
感谢您的帮助。
【问题讨论】:
标签: php zend-framework mapping models doctrine-orm
我正在我的 Zend 应用程序中从 Doctrine 1.1.4 升级到 Doctrine 2.0.6。
目前,我正在研究实体之间的关联。在教义 2 的Documentation 中,它说“关系可能是双向的或单向的。我对这些术语在给定上下文中的含义感到困惑。
如何确定关系是单向的还是双向的?
感谢您的帮助。
【问题讨论】:
标签: php zend-framework mapping models doctrine-orm
如果两个实体都包含对另一个的引用,则关系是双向的。
如果您省略其中一个引用,则它是单向的。
考虑一个典型的“帖子”和“标签”架构。通常,您会实现双向关联:
<?php
class Post {
// ...
/**
* @ManyToMany(targetEntity="Tag",inversedBy="posts")
*/
protected $tags;
// ...
}
class Tag {
// ...
/**
* @ManyToMany(targetEntity="Post",mappedBy="tags")
*/
protected $posts
// ...
}
现在,假设您决定从不(或很少)需要回答诸如“哪些帖子有标签 'foo'?”之类的问题。您可以在 Tag 实体中省略 $posts 关联,将其转换为单向关联,并减轻 ORM 的一些负担。
您仍然可以回答这类问题,但您必须编写代码才能做到这一点。
事实上,这可能是在帖子/标签方案中使用的好方法,因为您通常不会从标签中添加/删除帖子。通常,您只会在帖子中添加/删除标签。在查找“所有带有标签'x'的帖子”时,您只会从标签转到帖子,这可以在某种服务类中轻松实现。
【讨论】:
和 timdev 的回答一样,
单向和双向只是ORM的概念,这些与数据库无关, 假设你有一个 OneToMany 关系 -
用户有博客
因此,您可以将其作为 OneToMany 属性添加到您的用户实体中
但显然存在 ManyToOne 关系
博客有用户
所以您可以选择在您的博客实体中创建多对一关系,如果您想从博客实体访问用户,请添加此属性,如果您不想要则不要添加,它不是必需的。 在这两种情况下(您是否添加双向引用)ORM 将保持相同的数据库结构(博客表将具有 user_id 列)。
【讨论】: