对很多结果进行多对多关系查询

时间:2015-06-30 08:40:35

标签: mysql symfony doctrine-orm

我正在为我的应用程序使用symfony2。我有两个实体,内容和相册与ManyToMany关系。例如,一个内容可能有很多专辑,反之亦然。

$em->getRepository('MyAppBundle:Content')
        ->createQueryBuilder('c')
        ->select('c.id, c.title, c.sequence, c.sequence_count, c.category_sequence, c.unique_id, c.priority, c.status')
        ->addSelect('o.slug as owner')
        ->addSelect('cat.slug as category')
        ->addSelect('a.name as album')
        ->innerJoin('c.content_owner', 'o')
        ->innerJoin('c.category', 'cat')
        ->leftJoin('c.albums', 'a')
        ->getQuery()
        ->getArrayResult();

使用此查询我想列出所有内容是否有专辑,它可以正常工作,但如果一个内容有两个专辑,则内容打印两次。我怎样才能避免重复?

由于

2 个答案:

答案 0 :(得分:0)

如果您正确配置了实体关系(http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html),您只需列出内容并循环浏览“相册”数组即可显示相应的相册。这意味着您不要在查询构建器中选择相册。

默认情况下,这将使用延迟加载,这意味着将为每个内容单独提取相册,为避免这种情况,请保留第->leftJoin('c.albums', 'a')

$em->getRepository('MyAppBundle:Content')
   ->createQueryBuilder('c')
   ->leftJoin('c.albums', 'a')
   ->getQuery()
   ->getResult();

您将获得阵列相册填充的水合物。

不幸的是,我不知道您使用的配置格式和模板引擎,因此我无法向您展示渲染部分的示例。

答案 1 :(得分:0)

我用group_concat函数解决了这个问题。我不得不使用beberlei / DoctrineExtensions扩展名作为Doctorine2尚未支持group_concat函数:

https://github.com/beberlei/DoctrineExtensions

这是我的最终代码:

Server.newClientSocket