protected Query::addSort()
Adds the sort to the build query.
Return value
\Drupal\Core\Entity\Query\Sql\Query Returns the called object.
File
- core/lib/Drupal/Core/Entity/Query/Sql/Query.php, line 165
Class
- Query
- The SQL storage entity query class.
Namespace
Drupal\Core\Entity\Query\Sql
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 | protected function addSort() { if ( $this -> count ) { $this ->sort = array (); } // Gather the SQL field aliases first to make sure every field table // necessary is added. This might change whether the query is simple or // not. See below for more on simple queries. $sort = array (); if ( $this ->sort) { foreach ( $this ->sort as $key => $data ) { $sort [ $key ] = $this ->getSqlField( $data [ 'field' ], $data [ 'langcode' ]); } } $simple_query = $this ->isSimpleQuery(); // If the query is set up for paging either via pager or by range or a // count is requested, then the correct amount of rows returned is // important. If the entity has a data table or multiple value fields are // involved then each revision might appear in several rows and this needs // a significantly more complex query. if (! $simple_query ) { // First, GROUP BY revision id (if it has been added) and entity id. // Now each group contains a single revision of an entity. foreach ( $this ->sqlFields as $field ) { $group_by = "$field [0].$field [1]" ; $this ->sqlGroupBy[ $group_by ] = $group_by ; } } // Now we know whether this is a simple query or not, actually do the // sorting. foreach ( $sort as $key => $sql_alias ) { $direction = $this ->sort[ $key ][ 'direction' ]; if ( $simple_query || isset( $this ->sqlGroupBy[ $sql_alias ])) { // Simple queries, and the grouped columns of complicated queries // can be ordered normally, without the aggregation function. $this ->sqlQuery->orderBy( $sql_alias , $direction ); if (!isset( $this ->sqlFields[ $sql_alias ])) { $this ->sqlFields[ $sql_alias ] = explode ( '.' , $sql_alias ); } } else { // Order based on the smallest element of each group if the // direction is ascending, or on the largest element of each group // if the direction is descending. $function = $direction == 'ASC' ? 'min' : 'max' ; $expression = "$function($sql_alias)" ; $expression_alias = $this ->sqlQuery->addExpression( $expression ); $this ->sqlQuery->orderBy( $expression_alias , $direction ); } } return $this ; } |
Please login to continue.