我有一个包含许多用户和许多设计的网站,每一个都是由一个用户创建的。用户还可以选择其他设计作为收藏夹,并可以转到显示他们收藏夹的页面。因此,用户和设计之间存在多对多的关系,称为“收藏”。
我想知道实现这种收藏关系的最佳方法是什么。我只是在寻找特定用户的收藏夹,而且只在一个页面上。似乎 Doctrine 默认返回一个包含所有相关对象的对象,所以我担心通过添加这种关系,我会突然在我的所有设计列表 API 调用中添加大量额外的对象。
关于如何设置的建议?我有所有实体的存储库。
我有一个包含许多用户和许多设计的网站,每一个都是由一个用户创建的。用户还可以选择其他设计作为收藏夹,并可以转到显示他们收藏夹的页面。因此,用户和设计之间存在多对多的关系,称为“收藏”。
我想知道实现这种收藏关系的最佳方法是什么。我只是在寻找特定用户的收藏夹,而且只在一个页面上。似乎 Doctrine 默认返回一个包含所有相关对象的对象,所以我担心通过添加这种关系,我会突然在我的所有设计列表 API 调用中添加大量额外的对象。
关于如何设置的建议?我有所有实体的存储库。
我将分享我在标签和帖子之间的实现(帖子可以有多个标签,每个标签可以与多个帖子相关联)。我认为这足以让您入门。设置非常简单:
在 Post 实体中,我有这个:
/**
* @ManyToMany(targetEntity="Tag", inversedBy="posts")
* @JoinTable(name="activity_relationship",
* joinColumns={@JoinColumn(name="object", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="subject", referencedColumnName="id")}
* )
*/
protected $tags;
在标签实体中,我有这个:
/**
* @ManyToMany(targetEntity="Post", mappedBy="tags")
*/
protected $posts;
连接表不需要实体。
对于带有标签的帖子,我只需访问 tags 属性就足够了,因为总会有少量的,但每个标签可能有成吨的帖子,所以我想要一些 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);