Итоги записи в связанной таблице (sum ()) - PullRequest
0 голосов
/ 23 января 2020

In Cake php 3.8 рассчитать сумму столбца из связанной таблицы. Как в этом 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'"

Может кто-нибудь помочь мне?

Заранее спасибо

1 Ответ

0 голосов
/ 23 января 2020

Так как вы хотите использовать SUM(), а я не вижу таблиц соединения, я бы предположил, что ассоциация Items равна hasMany.

По умолчанию hasManybelongsToMany) связанные данные извлекаются в отдельном запросе, если они содержатся, поэтому поле не будет отображаться в вашем основном запросе. Вместо этого вам придется явно присоединиться к ассоциации, что можно сделать с помощью методов innerJoinWith() и leftJoinWith().

Также обратите внимание, что вам не нужно переносить функцию в другое выражение, и Вы можете использовать обратный вызов для select(), чтобы получить ссылку на запрос, и, наконец, что не менее важно, есть также сокращенный метод identifier() для создания выражений идентификатора:

$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);

См. также

...