多次实施Doctrine - 有时候

时间:2012-08-11 03:57:24

标签: symfony doctrine-orm

我的网站包含许多用户和许多设计,每个用户都是由一个用户创建的。用户还可以选择其他设计作为收藏,并可以转到显示其收藏夹的页面。因此,用户和设计之间存在多对多关系,称为“收藏夹”。

我想知道实现这种收藏关系的最佳方式是什么。我只是为特定用户寻找收藏夹,而且只在一个页面上找。似乎Doctrine默认返回一个包含所有相关对象的对象,所以我担心通过添加这种关系,我会突然在我的所有Design list API调用中添加大量额外的对象。

有关如何设置的建议?我有适用于所有实体的存储库。

1 个答案:

答案 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);