/** * Add fields that are not mentioned in aggregate functions to GROUP BY. * * @param PreBuild $event */ public function onPreBuild(PreBuild $event) { $config = $event->getConfig(); $parameters = $event->getParameters(); $gridName = $config->offsetGetByPath(self::PATH_NAME); if (!$this->isApplicable($gridName, $parameters)) { return; } $selects = $config->offsetGetByPath(self::PATH_SELECT, []); $groupBy = $config->offsetGetByPath(self::PATH_GROUPBY); $groupBy = $this->groupByHelper->getGroupByFields($groupBy, $selects); if ($groupBy) { $config->offsetSetByPath(self::PATH_GROUPBY, implode(',', $groupBy)); } }
/** * @param array $value * @return array */ protected function getGroupByFields(array $value) { $groupByHelper = new GroupByHelper(); if (isset($value['groupBy'])) { $groupBy = $value['groupBy']; } else { $groupBy = []; } if (isset($value['select'])) { $select = $value['select']; } else { $select = []; } return $groupByHelper->getGroupByFields($groupBy, $select); }
/** * @dataProvider groupByDataProvider * @param array $selects * @param string $groupBy * @param array $expected */ public function testGetGroupByFields($selects, $groupBy, $expected) { $helper = new GroupByHelper(); $this->assertEquals($expected, $helper->getGroupByFields($groupBy, $selects)); }