Exemple #1
0
 /**
  * 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;
 }