关联table中一条记录的总计(sum())
Totals of a record in an associated table (sum ())
在 Cakephp 3.8 中,根据关联的 table 计算列的总和。如此 SQL:
SELECT orders.id, orders.number, SUM(items.total_uncovered) FROM orders
INNER JOIN items ON orders.id = items.order_id
GROUP BY orders.id
我正在这样尝试:
$orders = $this->Orders->find();
$orders->contain(['Items']);
$orders->select([
'id',
'number',
'order_total_uncovered' => $orders
->newExpr()
->add($orders->func()
->sum(new identifierExpression('Items.total_uncovered')))
]);
$orders->limit(20);
我收到消息:
"Unknown column 'Items.total_uncovered' in 'field list'"
有人可以帮助我吗?
提前致谢
由于您想利用 SUM()
,而我没有看到任何连接表,因此我假设 Items
关联是 hasMany
.
默认情况下 hasMany
(和 belongsToMany
)关联数据在包含时在单独的查询中检索,因此该字段不会显示在您的主查询中。您必须明确加入该协会,这可以使用 innerJoinWith()
和 leftJoinWith()
方法完成。
另请注意,您不需要将函数包装到另一个表达式中,您可以使用 select()
的回调来获取对查询的引用,最后但并非最不重要的一点是,还有一个identifier()
shorthand 创建标识符表达式的方法:
$orders = $this->Orders
->find()
->select(function (\Cake\ORM\Query $query) {
return [
'Orders.id',
'Orders.number',
'order_total_uncovered' => $query->func()->sum(
$query->identifier('Items.total_uncovered')
)
];
})
->innerJoinWith('Items')
->group('Orders.id')
->limit(20);
另见
在 Cakephp 3.8 中,根据关联的 table 计算列的总和。如此 SQL:
SELECT orders.id, orders.number, SUM(items.total_uncovered) FROM orders
INNER JOIN items ON orders.id = items.order_id
GROUP BY orders.id
我正在这样尝试:
$orders = $this->Orders->find();
$orders->contain(['Items']);
$orders->select([
'id',
'number',
'order_total_uncovered' => $orders
->newExpr()
->add($orders->func()
->sum(new identifierExpression('Items.total_uncovered')))
]);
$orders->limit(20);
我收到消息:
"Unknown column 'Items.total_uncovered' in 'field list'"
有人可以帮助我吗?
提前致谢
由于您想利用 SUM()
,而我没有看到任何连接表,因此我假设 Items
关联是 hasMany
.
默认情况下 hasMany
(和 belongsToMany
)关联数据在包含时在单独的查询中检索,因此该字段不会显示在您的主查询中。您必须明确加入该协会,这可以使用 innerJoinWith()
和 leftJoinWith()
方法完成。
另请注意,您不需要将函数包装到另一个表达式中,您可以使用 select()
的回调来获取对查询的引用,最后但并非最不重要的一点是,还有一个identifier()
shorthand 创建标识符表达式的方法:
$orders = $this->Orders
->find()
->select(function (\Cake\ORM\Query $query) {
return [
'Orders.id',
'Orders.number',
'order_total_uncovered' => $query->func()->sum(
$query->identifier('Items.total_uncovered')
)
];
})
->innerJoinWith('Items')
->group('Orders.id')
->limit(20);
另见