protected function Select::prepareCountQuery in Drupal 9
Same name and namespace in other branches
- 8 core/lib/Drupal/Core/Database/Query/Select.php \Drupal\Core\Database\Query\Select::prepareCountQuery()
Prepares a count query from the current query object.
Return value
\Drupal\Core\Database\Query\Select A new query object ready to have COUNT(*) performed on it.
1 call to Select::prepareCountQuery()
- Select::countQuery in core/
lib/ Drupal/ Core/ Database/ Query/ Select.php - Get the equivalent COUNT query of this query as a new query object.
File
- core/
lib/ Drupal/ Core/ Database/ Query/ Select.php, line 730
Class
- Select
- Query builder for SELECT statements.
Namespace
Drupal\Core\Database\QueryCode
protected function prepareCountQuery() {
// Create our new query object that we will mutate into a count query.
$count = clone $this;
$group_by = $count
->getGroupBy();
$having = $count
->havingConditions();
if (!$count->distinct && !isset($having[0])) {
// When not executing a distinct query, we can zero-out existing fields
// and expressions that are not used by a GROUP BY or HAVING. Fields
// listed in a GROUP BY or HAVING clause need to be present in the
// query.
$fields =& $count
->getFields();
foreach (array_keys($fields) as $field) {
if (empty($group_by[$field])) {
unset($fields[$field]);
}
}
$expressions =& $count
->getExpressions();
foreach (array_keys($expressions) as $field) {
if (empty($group_by[$field])) {
unset($expressions[$field]);
}
}
// Also remove 'all_fields' statements, which are expanded into tablename.*
// when the query is executed.
foreach ($count->tables as &$table) {
unset($table['all_fields']);
}
}
// If we've just removed all fields from the query, make sure there is at
// least one so that the query still runs.
$count
->addExpression('1');
// Ordering a count query is a waste of cycles, and breaks on some
// databases anyway.
$orders =& $count
->getOrderBy();
$orders = [];
if ($count->distinct && !empty($group_by)) {
// If the query is distinct and contains a GROUP BY, we need to remove the
// distinct because SQL99 does not support counting on distinct multiple fields.
$count->distinct = FALSE;
}
// If there are any dependent queries to UNION, prepare each of those for
// the count query also.
foreach ($count->union as &$union) {
$union['query'] = $union['query']
->prepareCountQuery();
}
return $count;
}