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)