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 shape_predictor_68_face_landmarks.dat
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料