【发布时间】:2014-05-14 19:35:12
【问题描述】:
在我的应用程序中,我有用户可以阅读的帖子。我想捕捉这种状态,但我被困在如何通过实体结构和关系来实现这一点。
我的想法是拥有一个 User 和 Post 实体并捕获阅读状态以使用看起来像这样的 PostMeta 实体:
class PostMeta {
/** @ORM\OneToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") */
protected $user;
/** @ORM\ManyToOne(targetEntity="Post", inversedBy="meta") */
protected $post;
/** @ORM\Column(name="is_read", type="boolean") */
protected $isRead;
}
PostMeta 将始终与用户保持 OneToOne 关系,因为它只能属于单个用户。但是,它会与 Post 具有 ManyToOne 关系,因为许多用户可以拥有同一个 Post 的 PostMeta。
要加载实际的 PostMeta,Post 将有一个 $meta 属性,可以将 PostMeta 加载到该属性中。因此,帖子只会加载特定用户:
class Post {
/** @ORM\ManyToMany(targetEntity="User", mappedBy="posts") */
protected $users;
/** @ORM\OneToMany(targetEntity="PostMeta", mappedBy="posts") */
protected $meta;
}
有两件事我被困在:
- 这是解决此问题的好方法吗?
- 如何编写 DQL 来检索此信息,记住当用户 由于 PostMeta 仅在用户已阅读帖子时创建,所以还没有阅读帖子,因此不会有 PostMeta 条目。
【问题讨论】:
-
PostMeta中的isRead字段似乎是多余的 -
那么你建议我在哪里跟踪这个状态?将来我可能会添加其他状态,例如已加星标。
标签: php doctrine-orm entity-relationship dql