protected 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.
File
- core/lib/Drupal/Core/Database/Query/Select.php, line 718
Class
- Select
- Query builder for SELECT statements.
Namespace
Drupal\Core\Database\Query
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | 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 = array (); 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 ; } |
Please login to continue.