我的网站包含许多用户和许多设计,每个用户都是由一个用户创建的。用户还可以选择其他设计作为收藏,并可以转到显示其收藏夹的页面。因此,用户和设计之间存在多对多关系,称为“收藏夹”。
我想知道实现这种收藏关系的最佳方式是什么。我只是为特定用户寻找收藏夹,而且只在一个页面上找。似乎Doctrine默认返回一个包含所有相关对象的对象,所以我担心通过添加这种关系,我会突然在我的所有Design list API调用中添加大量额外的对象。
有关如何设置的建议?我有适用于所有实体的存储库。
答案 0 :(得分:0)
我将分享我在标签和帖子之间的实现(帖子可以有多个标签,每个标签可以与多个帖子相关联)。我认为它足以让你开始。它的设置非常简单:
在Post实体中,我有这个:
/**
* @ManyToMany(targetEntity="Tag", inversedBy="posts")
* @JoinTable(name="activity_relationship",
* joinColumns={@JoinColumn(name="object", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="subject", referencedColumnName="id")}
* )
*/
protected $tags;
在Tag实体中,我有:
/**
* @ManyToMany(targetEntity="Post", mappedBy="tags")
*/
protected $posts;
加入表没有必要的实体。
对于带有标签的帖子,我只能访问标签属性,因为总会有少量,但每个标签可能有吨和吨的帖子,所以我想要一些LIMIT和OFFSET对此进行控制。出于这个原因,正如上面提到的Cerad,你不需要直接使用$ posts变量,而是使用dql单独查询。
SELECT t
FROM Post p
JOIN p.tags t
<add whatever other stuff you want>
无论您喜欢哪种方式执行该查询,您都可能拥有一个来自Doctrine的查询对象,以应用LIMIT和OFFSET,只需执行
$query->setMaxResults($limit);
$query->setFirstResult($offset);