Как выполнить операцию суммирования (суммировать поле) в ассоциированной таблице, а не в родительской таблице, используя встроенную функцию суммирования cakephp 3.2?

Я хочу подытожить поле в cakephp 3.2. Но поле присутствует в ассоциации модели hasOne.

Я хочу сделать это в запросе на привязку.

У меня есть таблица заказов, и я делаю привязку модели к таблице коллекций.

Здесь я хочу суммировать все due_amount в таблице коллекций.

Я пробовал, но это не работает.

Пожалуйста, проверьте мой код, с ним что-то не так?

 $this->Orders->hasOne('Collections', [
                'className' => 'Collections',
                'foreignKey' => 'order_id',
                'strategy' => 'select',
                'conditions' => function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
                    $query->order(['Collections.id' => 'ASC']);
                    return [];
                }
                    ]);
            $get_total_sales = $this->Orders->find('all')->where($condition)->select(['id', 'region_id', 'net_total'])->contain(['Collections' => ['queryBuilder' => function ($q) {
                                return $q->select(['id', 'order_id', 'total_sale_amount', 'due_amount']);
                            }]])->order(['Orders.due_date DESC']);


$res2 = $get_total_sales->select(['total_due' =>$get_total_sales->func()->sum('collection.due_amount')])->first(); 

 echo  $due = $res2->total_due;//its showing column not find error.
Is it working in order table instead of collections table?
How can i do it for collection table using the $get_total_sales listing results?



Below some out put 

[
    {
        "id": 40,
        "region_id": 2,
        "net_total": 2899.12,
        "collection": {
            "id": 182,
            "order_id": 40,
            "total_sale_amount": 2899.12,
            "due_amount": 1990
        },

    },
    {
        "id": 38,
        "region_id": 2,
        "net_total": 110,
        "collection": {
            "id": 181,
            "order_id": 38,
            "total_sale_amount": 110,
            "due_amount": 10
        },

    },
    {
        "id": 39,
        "region_id": 2,
        "net_total": 16670,
        "collection": {
            "id": 190,
            "order_id": 39,
            "total_sale_amount": 16670,
            "due_amount": 16630.99
        },

    },

Здесь я хочу суммировать все due_amount в таблице коллекций.

Спасибо


person sradha    schedule 04.10.2016    source источник
comment
не могли бы вы также поделиться схемой БД для этих 2 таблиц, а также есть одно сомнение, если есть отношение hasOne, то, очевидно, у вас всегда будет только один результат из связанной таблицы, тогда зачем вам нужна сумма, пожалуйста, объясните сценарий лучше и желаемый результат.   -  person Rohit Ailani    schedule 04.10.2016
comment
@Rohit Ailani На самом деле у одной записи есть несколько коллекций, но мне нужна последняя. Итак, я сделал его одним и получил необходимые данные. Но я хочу суммировать все записи, и здесь суммирование будет выполнено в дочерней таблице.   -  person sradha    schedule 04.10.2016
comment
@Rohit Ailani У меня есть одна таблица, в которой есть заказ, а в одном заказе несколько коллекций.   -  person sradha    schedule 04.10.2016
comment
ok В этом случае вы можете использовать виртуальное поле дочерней таблицы, в вашем случае таблицы Collections. запись условий с основной таблицей не работает. В виртуальном поле вы можете написать функцию суммы.   -  person Rohit Ailani    schedule 04.10.2016
comment
[book.cakephp.org/3.0/en/ orm/ вы можете проверить, как создавать виртуальные поля в cake3 здесь.   -  person Rohit Ailani    schedule 04.10.2016
comment
это послужило цели, я пишу это как решение для вашего запроса, и если вы хотите, я также могу помочь.   -  person Rohit Ailani    schedule 04.10.2016


Ответы (1)


Вы можете использовать виртуальное поле дочерней таблицы, которая в вашем случае является таблицей коллекций.

Вы можете ознакомиться с документацией по созданию виртуальных полей в cakephp3 здесь< /а>

А в виртуальном поле можно указать функцию суммы. Чтобы написать функцию суммы, вы можете обратиться здесь

person Rohit Ailani    schedule 04.10.2016
comment
да, виртуальное поле - это один из способов, и я обнаружил способ без использования vf. так что спасибо тебе :) - person sradha; 04.10.2016
comment
пожалуйста, поделитесь и другим способом, поэтому, если кому-то еще потребуется, они могут получить доступ к обоим. - person Rohit Ailani; 04.10.2016
comment
Я принял ваш ответ, так как это одно из решений моей проблемы. - person sradha; 04.10.2016
comment
да, и пока что я знаю, что это лучшее решение, иначе вы могли бы взломать компонент или какое-то другое решение. Но это лучшее решение путем создания виртуального поля. Как я видел, многие программисты держались подальше от этого подхода. - person Rohit Ailani; 04.10.2016