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。
我有一个关于多个 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。