dpnvrt3119 2017-02-25 21:45
浏览 44
已采纳

Symfony3 querybuilder命令数不胜数

I have an entity called Tag, it has 3 ManyToMany relations fests, articles and news.

AppBundle\Entity\Tag:
    type: entity
    table: tag
    ...
  manyToMany:
      news:
          orderBy: { 'posted': 'DESC' }
          targetEntity: News
          inversedBy: tags
          joinTable:
            name: news_tag
            joinColumns:
              tag_id:
                referencedColumnName: id
            inverseJoinColumns:
              news_id:
                referencedColumnName: id
      articles:
          orderBy: { 'posted': 'DESC' }
          targetEntity: Article
          inversedBy: tags
          joinTable:
            name: article_tag
            joinColumns:
              tag_id:
                referencedColumnName: id
            inverseJoinColumns:
              article_id:
                referencedColumnName: id
      fests:
          orderBy: { 'when_starts': 'DESC', 'when_ends': 'DESC' }
          targetEntity: Fest
          inversedBy: tags
          joinTable:
            name: fest_tag
            joinColumns:
              tag_id:
                referencedColumnName: id
            inverseJoinColumns:
              fest_id:
                referencedColumnName: id

Now I want to write a createQueryBuilder that orders by the count "news" + count "articles" + count "fests", just for finding "TOP TAGS". I found solution only for one manyToMany relation.

Is there any way to do this?

EDIT: What I have:

    $qb->select(array(
        't.id', 
        't.name', 
        'COUNT(f) as festcount',
        'COUNT(n) as newscount',
        'COUNT(a) as articlescount',
        '(COUNT(f) + COUNT(n) + COUNT(a)) as totalcount'
        ))
    ->from('AppBundle:Tag', 't')
    ->leftJoin('t.fests', 'f')
    ->leftJoin('t.articles', 'a')
    ->leftJoin('t.news', 'n')
    ->groupBy('t.id')
    ->orderBy('totalcount', 'DESC');

But it giving fake results. When some tag has 3 fests, 1 article and 0 news, result is festcount = 3, newscount = 0, articlescount = 3 and totalcount = 6, and it should be 4.

  • 写回答

1条回答 默认 最新

  • dongwuxie7976 2017-02-26 15:14
    关注

    Try this code:

    $qb->select(array(
            't.id', 
            't.name', 
            'COUNT(DISTINCT f.id) as festcount',
            'COUNT(DISTINCT n.id) as newscount',
            'COUNT(DISTINCT a.id) as articlescount',
            '(festcount + newscount + articlescount) as totalcount'
            ))
        ->from('AppBundle:Tag', 't')
        ->leftJoin('t.fests', 'f')
        ->leftJoin('t.articles', 'a')
        ->leftJoin('t.news', 'n')
        ->groupBy('t.id')
        ->orderBy('totalcount', 'DESC');
    

    If you'll need further help, please provide dump of those tables.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题