Search code examples
laravelamcharts

amcharts - Force Directed Tree - convert data Laravel PHP


I am trying to display a force directed tree. There are 3 models Company / Division / Department

Each Company has many divisions. Each division belongs to one Company.

Each Division has many departments. Each department belongs to one Division.

amcharts expects a syntax like:

[{
  "name": "First",
  "children": [{
    "name": "A1", "value": 100
  }, {
    "name": "A2", "value": 60
  }, {
    "name": "A3", "value": 30
  }]
}, {
  "name": "Second",
  "children": [{
    "name": "B1", "value": 135
  }, {
    "name": "B2", "value": 98
  }, {
    "name": "B3", "value": 56
  }]
}, {
  "name": "Third",
  "children": [{
    "name": "C1", "value": 335
  }, {
    "name": "C2", "value": 148
  }, {
    "name": "C3", "value": 126
  }, {
    "name": "C4", "value": 26
  }]
}, {
  "name": "Fourth",
  "children": [{
    "name": "D1", "value": 415
  }, {
    "name": "D2", "value": 148
  }, {
    "name": "D3", "value": 89
  }, {
    "name": "D4", "value": 64
  }, {
    "name": "D5", "value": 16
  }]
}, {
  "name": "Fifth",
  "children": [{
    "name": "E1", "value": 687
  }, {
    "name": "E2", "value": 148
  }]
}]

I am only able to get the first level here:

foreach ($companies as $company) {
    $data[] = 
            (object) [
             'name' => $company->name,
             'value' => $company->value,
            ];
}

I am sure that I need to further iterate through $company->devisions and so on but not sure how to build the final construct amcharts is expecting. Any hints?


Solution

  • You can try something in the lines of:

            $data = [];
            foreach ($companies as $company) {
                $childrenArray = [
                    'name' => $company->name,
                ];
                foreach ($company->divisions as $division) {
                    $childArray['children'][] = [
                        'name' => $division->name,
                        'value' => $division->value,
                    ];
                }
                $data[] = $childrenArray;
            }
            return json_encode($data);