Php 关系字段的按计数排序

Php 关系字段的按计数排序,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我有以下关系: 会员一对多产品 产品多对一会员 这就是我的查询: $qb = $this->createQueryBuilder('m'); $qb ->where('m.Authority = :Authority') ->setParameter('Authority', Authority::CREATOR) ->innerJoin('m.Product', 'p') ->select('COUNT(p) AS HIDDEN i

我有以下关系:

会员
一对多
产品

产品
多对一
会员

这就是我的查询:

$qb = $this->createQueryBuilder('m');
$qb
    ->where('m.Authority = :Authority')
    ->setParameter('Authority', Authority::CREATOR)
    ->innerJoin('m.Product', 'p')
    ->select('COUNT(p) AS HIDDEN item_count', 'm')
    ->groupBy('m')
    ->orderBy("item_count", "ASC");
但是,当我为产品状态添加其他参数时

$qb = $this->createQueryBuilder('m');
$qb
    ->where('m.Authority = :Authority')
    ->setParameter('Authority', Authority::CREATOR)
    ->andWhere('p.Status = :Status')
    ->setParameter('Status', 1);
    ->innerJoin('m.Product', 'p')
    ->select('COUNT(p) AS HIDDEN item_count', 'm', 'p')
    ->groupBy('p')
    ->orderBy("item_count", "ASC");
订单已经不再发生了。我转储了
item\u count的值,它总是
1
。有人遇到过同样的问题吗?这里的目标是获得按产品数量排序的产品状态为1的成员列表

编辑:
如果我将
groupBy('p')
更改为
groupBy('m')
,它将只为每个
成员加载一个相关的
产品
,对于遇到相同问题的任何人,我就是这样做的:

$qb = $this->createQueryBuilder('m');
$qb
    ->where('m.Authority = :Authority')
    ->setParameter('Authority', Authority::CREATOR)
    ->andWhere('p.Status = :Status')
    ->setParameter('Status', 1);
    ->select('p, m')
    ->addSelect('(SELECT COUNT(DISTINCT p1)
    FROM Eccube\Entity\Member m1
    INNER JOIN Eccube\Entity\Product p1
    WHERE m1.Authority = ' . Authority::CREATOR . ' AND p1.Status = 1 AND p1.Creator = m.id
    ) AS hidden item_count')
    ->innerJoin('m.Product', 'p')
    ->groupBy('p')
    ->orderBy("item_count", "ASC");
它可以工作,但我不明白为什么这是
p1.Creator=m.id
?如果我使用
m1.id
,它只会对项目计数求和

编辑:在Jakumi关于加入的评论之后添加了更新的代码。尽管这两种代码都可以工作,但第二种代码更有意义

$qb = $this->createQueryBuilder('m');
$qb
    ->where('m.Authority = :Authority')
    ->setParameter('Authority', Authority::CREATOR)
    ->andWhere('p.Status = :Status')
    ->setParameter('Status', 1);
    ->select('p, m')
    ->addSelect('(SELECT COUNT(DISTINCT p1)
    FROM Eccube\Entity\Member m1
    INNER JOIN m1.Product p1
    WHERE m1.Authority = ' . Authority::CREATOR . ' AND p1.Status = 1 AND p1.Creator = m
    ) AS hidden item_count')
    ->innerJoin('m.Product', 'p')
    ->groupBy('p')
    ->orderBy("item_count", "ASC");

好。。。如果按产品分组,显然产品计数始终为1,并且订购工作正常,因为在其他计数之前没有更高的计数。此外,如果按m分组,则一个成员的所有行都将折叠,因此只能得到一个乘积p,但应该得到正确的乘积计数。我有这样的感觉,你并不完全理解分组是如何工作的。简而言之:只有一个联接(并且没有子查询),您将无法将所有单个产品和产品计数作为一个聚合。您需要添加另一个查询或另一个联接/子查询。谢谢@Jakumi。你的评论帮我找到了正确的方向。我已经回答了我自己的问题。虽然我已经让它工作了,但仍然有一些东西让我困惑。也许你可以帮我弄清楚更多。问题是,这个子查询select不带m1而不是m,它与主查询没有关联,然后它将计算所有成员的所有乘积。您的连接有点奇怪,您可能尝试了
内部连接m1.Product p1
。您可能根本没有m1,只需说
p1.creator=m
tbh即可。但我不完全确定,orm对实体了解多少,以及有多少魔法正在发生;o)