/** * Modify the query to count occurences of a value in a column * * @param QueryBuilder $table without prefix * @param string $uniqueColumn name * @param array $options for special behavior * @param string $tablePrefix */ public function modifyCountQuery(QueryBuilder &$query, $uniqueColumn, $options = [], $tablePrefix = 't') { $query->select('COUNT(' . $tablePrefix . '.' . $uniqueColumn . ') AS count'); // Count only unique values if (!empty($options['getUnique'])) { $selectAlso = ''; if (isset($options['selectAlso'])) { $selectAlso = ', ' . implode(', ', $options['selectAlso']); } // Modify the previous query $query->select($tablePrefix . '.' . $uniqueColumn . $selectAlso); $query->having('COUNT(*) = 1')->groupBy($tablePrefix . '.' . $uniqueColumn . $selectAlso); // Create a new query with subquery of the previous query $uniqueQuery = $this->connection->createQueryBuilder(); $uniqueQuery->select('COUNT(' . $tablePrefix . '.' . $uniqueColumn . ') AS count')->from('(' . $query->getSql() . ')', $tablePrefix); // Apply params from the previous query to the new query $uniqueQuery->setParameters($query->getParameters()); // Replace the new query with previous query $query = $uniqueQuery; } return $query; }