Prepare parameters. $selection = array( 'region.name as region_name', 'company.name as company_name', 'profile.firstName as firstName', 'profile.familyName as familyName', 'profile.mobile as mobile', 'COUNT(DISTINCT auction.id) as bids', 'SUM(CASE WHEN auction.currentBid = bid.id AND auction.jobState=\'Sold\' THEN 1 ELSE 0 END) AS winning', 'SUM(CASE WHEN auction.currentBid = bid.id AND auction.jobState=\'Sold\' THEN stock.tradePrice ELSE 0 END) AS tradePrice', 'SUM(CASE WHEN auction.currentBid = bid.id AND auction.jobState=\'Sold\' THEN auction.currentBidPrice ELSE 0 END) AS bidPrice' ); $where = array(); $params = array(); $query = 'SELECT [SELECTION] FROM \Auction\Entity\Bid bid ' . ' LEFT JOIN bid.auction auction ' . ' LEFT JOIN auction.stock stock ' . ' LEFT JOIN bid.company company ' . ' LEFT JOIN bid.profile profile' . ' LEFT JOIN company.region region ' . ' LEFT JOIN company.group grp ' . ' LEFT JOIN company.groupDivision division ' . '[WHERE] ' . 'GROUP BY bid.profile'; $where[] = 'bid.created >= :start'; $where[] = 'bid.created <= :end'; #-> Construct details. if (!isset($this->_input['dateFrom']) || empty($this->_input['dateFrom'])) { if ($this->_input['dateTo'] && !empty($this->_input['dateTo'])) { $parts = explode('-', $this->_input['dateTo']); $this->_input['dateFrom'] = date('Y-m-d', mktime(1, 0, 0, $parts[1], 1, $parts[0])); } else { $this->_input['dateTo'] = date('Y-m-d', mktime(23, 59, 59, date('m'), 0, date('Y'))); $this->_input['dateFrom'] = date('Y-m-d', mktime(1, 0, 0, date('m') - 1, 1, date('Y'))); } } if (!isset($this->_input['dateTo']) || empty($this->_input['dateTo'])) { $parts = explode('-', $this->_input['dateFrom']); $this->_input['dateTo'] = date('Y-m-d', mktime(1, 0, 0, $parts[1] + 1, 0, $parts[0])); } $this->_queries['Date Range From'] = $this->_input['dateFrom']; $params['start'] = new \DateTime($this->_input['dateFrom']); $this->_queries['Date Range Until'] = $this->_input['dateTo']; $params['end'] = new \DateTime($this->_input['dateTo'] . ' 23:59:59'); if (isset($this->_input['group']) && !empty($this->_input['group']) && 'null' != $this->_input['group']) { $this->_queries['Group'] = $this->em ->find('\Company\Entity\Group', $this->_input['group']) ->name; $where[] = 'grp.id = :group'; $params['group'] = $this->_input['group']; } if (isset($this->_input['groupDivision']) && !empty($this->_input['groupDivision']) && 'null' != $this->_input['groupDivision']) { $this->_queries['Division'] = $this->em ->find('\Company\Entity\GroupDivision', $this->_input['groupDivision']) ->name; $where[] = 'division.id = :division'; $params['division'] = $this->_input['groupDivision']; } if (isset($this->_input['company']) && !empty($this->_input['company']) && 'null' != $this->_input['company']) { $this->_queries['Dealership'] = $this->em ->find('\Company\Entity\Company', $this->_input['company']) ->name; $where[] = 'company.id = :company'; $params['company'] = $this->_input['company']; } #-> Finalize query. $query = str_replace(array( '[SELECTION]', '[WHERE]' ), array( implode(', ', $selection) . ' ', !empty($where) ? 'WHERE ' . implode(' AND ', $where) . ' ' : ' ' ), $query); $query = $this->em->createQuery($query); !empty($params) && $query->setParameters($params); $this->_data = $query->getResult(); foreach ($this->_data as $key => $data) { $this->_data[$key]['percentage'] = 0 < $data['tradePrice'] ? round(($data['bidPrice'] / $data['tradePrice']) * 100) : 0; $this->_data[$key]['fullname'] = $data['firstName'] . ' ' . $data['familyName']; } $this->em->clear(); } }