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 burpsuite密码爆破
    • ¥15 关于#ubuntu#的问题,如何解决?(相关搜索:移动硬盘)
    • ¥15 scikit安装之后import不了
    • ¥15 Ros2编译一个使用opencv的c++节点的时候,报了这个错误,请问怎么解决啊
    • ¥15 人脸识别相关算法 YOLO,AI等
    • ¥15 spark问题方便加V17675797079
    • ¥15 Python代码不打印的原因
    • ¥20 微软SEAL库的安装和使用,VS2022环境配置问题
    • ¥15 数学问题也不知道那种类型的问题
    • ¥15 R作图的时候,文本框重叠了怎么办?