Cakephp 3 hasMany ассоциативный массив для преобразования в правильный формат JSON - PullRequest
0 голосов
/ 08 мая 2018

У меня есть следующий массив, который мне нужно расположить в формате json. Я использую cakephp3, в котором таблица сотрудников имеет много связей с таблицами миль и расходов. Я восстановил весь массив, который мне нужно расположить в правильном формате json. Я пытался, но не смог преобразовать в правильный формат JSON.

Array
(
    [0] => App\Model\Entity\Employee Object
        (
            [id] => 246
            [department] => Management
            [employee_name] => Employee_1
            [car_registration] => uk074wzx
            [expenses] => Array
            (
                [0] => App\Model\Entity\Expense Object
                    (
                        [employee_id] => 246
                        [expense_amount] => 160
                    )

                [1] => App\Model\Entity\Expense Object
                    (
                        [employee_id] => 246
                        [expense_amount] => 150              
                    )
            )

            [mileages] => Array
                (
                    [0] => App\Model\Entity\Mileage Object
                    (
                        [employee_id] => 246
                        [mileage_km] => 8.918
                        [mileage_amount] => 78.4
                        [subsistence] => domestic_day
                        [subsistence_rate] => 33.61
                    )

                    [1] => App\Model\Entity\Mileage Object
                    (
                        [employee_id] => 246
                        [mileage_km] => 70.671
                        [mileage_amount] => 78.4
                        [day_allowance] => 33.61
                    )

                    [2] => App\Model\Entity\Mileage Object
                    (
                        [employee_id] => 246
                        [mileage_km] => 40.997
                        [mileage_amount] => 78.4
                        [day_allowance] => 33.61
                    )
            )
    )

    [1] => App\Model\Entity\Employee Object
    (
        [id] => 247
        [department] => Testing
        [employee_name] => Employee_2
        [car_registration] => uk074wzx
        [expenses] => Array
            (
                [0] => App\Model\Entity\Expense Object
                    (
                        [employee_id] => 247
                        [expense_amount] => 50
                    )

                [1] => App\Model\Entity\Expense Object
                    (
                        [employee_id] => 247
                        [expense_amount] => 30
                    )
            )

        [mileages] => Array
            (
                [0] => App\Model\Entity\Mileage Object
                    (
                        [employee_id] => 247
                        [mileage_km] => 131.137
                        [mileage_amount] => 78.4
                        [day_allowance] => 33.61
                    )

                [1] => App\Model\Entity\Mileage Object
                    (
                        [employee_id] => 247
                        [mileage_km] => 131.018
                        [mileage_amount] => 78.4
                        [day_allowance] => 33.61
                    )
            )
    )

    [2] => App\Model\Entity\Employee Object
    (
        [id] => 248
        [department] => Design
        [employee_name] => sbn emp3
        [car_registration] => uk074wzx
        [expenses] => Array
            (
            )

        [mileages] => Array
            (
            )
    )
)

JSON формат, как мне нужно организовать:

"data": [
    {
    "date": "2018-04-30(month end date)",
    "items": [
            {
                "employee_id": 246,
                "employee_name": "Employee_1",
                "department": "Management",
                "car_registration": "uk074wzx",
                "mileage_km": 120.586,
                "mileage_amount": 235.2,
                "day_allowance": 100.83,
                "night_allowance": 0
                "expense_amount": 310
            },
            {
                "employee_id": 247,
                "employee_name": "Employee_2",
                "department": "Testing",
                "car_registration": "uk074wzx",
                "mileage_km": 382.741,
                "mileage_amount": 392,
                "day_allowance": 168.05,
                "night_allowance": 0
                "expense_amount": 80
            },
            {
                "employee_id": 248,
                "employee_name": "sbn emp3",
                "department": "Design",
                "car_registration": "uk074wzx",
                "mileage_km": 0,
                "mileage_amount": 0,
                "day_allowance": 0,
                "night_allowance": 0
                "expense_amount": 0
            }
        ]
    }
]

Пожалуйста, помогите мне преобразовать массив в JSON. Thankyou.

1 Ответ

0 голосов
/ 22 мая 2018

В классе EmployeeController

$employee = $this->Employee->find('all')
                 ->contain(['Expenses', 'Mileages'])
                 ->enableHydration(false)
                 ->toArray();

//prepare json data
$emp = array();
foreach($employee as $key => $value) {
    $emp[] = [
        "employee_id" = $value['employee_id'] ?? '',
        "employee_name" = $value['employee_name'] ?? '',
        "department" = $value['department'] ?? '',
        "car_registration" = $value['car_registration'] ?? ''
     ];
     if(!empty($value['mileages'])) {
         $mileages= new Collection($value['mileages']);
         $emp[] = [
         "mileage_km " = $mileages->sumOf('mileage_km') ??'',
         "mileage_amount" = $mileages->sumOf('mileage_amount') ?? '',
         "day_allowance" = $mileages->sumOf('day_allowance') ?? '',
         "night_allowance" = $mileages->sumOf('night_allowance') ?? '',
         ];
     }
     if(!empty($value['expenses'])) {
         $expenses= new Collection($value['expenses']);
         $emp[] = [
         "expense_amount" = $expenses->sumOf('expense_amount') ??'',
        ];
     }
}

$this->set([
        'items' => $emp,
        'date': '2018-04-30(month end date)',
        '_serialize' => ['date', 'items']
]);
...