phpcakephpcakephp-3.xcakephp-3.2

How to do sum operation(sum a field) in associate table not in the parent table using cakephp 3.2 inbuilt sum functionality?


I want to sum up a field in cakephp 3.2. But the field is present in hasOne model association.

I want to do it in the bind query .

I have a order table and i am doing model bind with collection table .

Here i want to sum up all the due_amount in collections table

I have tried but its not working.

Please check my code,Is there any thing wrong with it.?

 $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
        },

    },

Here i want to sum up all the due_amount in collections table

Thank you


Solution

  • You can use the virtual field of the child table, which in your case is the Collections table.

    You can check the documentation to create virtual fields in cakephp3 here

    And in virtual field you can specify the sum function. To write the sum function you can refer here