关联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);

另见