我正在为我的应用程序使用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();
使用此查询我想列出所有内容是否有专辑,它可以正常工作,但如果一个内容有两个专辑,则内容打印两次。我怎样才能避免重复?
由于
答案 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