Doctrine QueryBuilder - 多个 select 字段

Doctrine QueryBuilder - multiple select fields

我有一个关于多个 select 字段的奇怪问题。 这是我的查询:

$query = $queryBuilder
            ->select(
                [
                    'SUM(t1.quantity) AS quantity_t1',
                    't2.currency AS currency_t2',
                    'SUM(t1.amount - t1.promotionDiscount) AS amount_t1',
                    'SUM(ROUND((t1.amount - t1.promotionDiscount) / ((100 + t2.tax) / 100), 2)) AS amount_net',
                    'SUM(ROUND((t1.amount - t1.promotionDiscount) / '.EXCHANGE_RATE_GBP.', 2)) AS amount_gbp',
                    'SUM(ROUND(ROUND((t1.amount - t1.promotionDiscount) / '.EXCHANGE_RATE_GBP.', 2) / ((100 + t2.tax) / 100), 2)) AS amount_gbp_net'
                ]
            )
            ->from(Sale::class, 't2')
            ->join(
                SaleRow::class,
                't1',
                Join::WITH,
                $queryBuilder->expr()->andX(
                    $queryBuilder->expr()->eq('t1.saleId', 't2.id')
                )
            )
            ->where(
                $queryBuilder->expr()->between('t2.purchaseTime', ':start', ':end')
            )
            ->andWhere(
                $queryBuilder->expr()->in('t2.orderStatus', ':status')
            )
            ->setParameters(
                [
                    ':start' => $startDate->format('Y-m-d H:i:s'),
                    ':end' => $endDate->format('Y-m-d H:i:s'),
                    ':status' => ['pending', 'shipped']
                ]
            )
            ->getQuery();

        $results = $query->getArrayResult();

查询有效,但前提是我更改 select 数组:

例如像这样:

->select(
    [
       't1.id',
       't2.id'
    ]
 )

而且很奇怪... 这有效:

->select(
    [
        'SUM(t1.quantity) AS quantity_t1',
        'SUM(t1.amount - t1.promotionDiscount) AS amount_t1'
    ]
)

还有这个:

->select(
    [
        't2.currency AS currency_t2',
    ]
)

但是..这不起作用:

->select(
    [
        'SUM(t1.quantity) AS quantity_t1',
        't2.currency AS currency_t2',
    ]
)

为什么?

您不能在 SQL 查询中混合使用聚合和非聚合。

因为聚合将 return 一个值。 非聚合将 return 每个值。

如何在响应中混合这些结果?

其他问题,你在DQL中使用了一个ROUND()函数。但是这个功能不存在,你得register it a custom DQL function.

参见this question