public Select::__toString()
Implements PHP magic __toString method to convert the query to a string.
The toString operation is how we compile a query object to a prepared statement.
Return value
string A prepared statement query string for this object.
Overrides Query::__toString
File
- core/lib/Drupal/Core/Database/Query/Select.php, line 778
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | public function __toString() { // For convenience, we compile the query ourselves if the caller forgot // to do it. This allows constructs like "(string) $query" to work. When // the query will be executed, it will be recompiled using the proper // placeholder generator anyway. if (! $this ->compiled()) { $this ->compile( $this ->connection, $this ); } // Create a sanitized comment string to prepend to the query. $comments = $this ->connection->makeComment( $this ->comments); // SELECT $query = $comments . 'SELECT ' ; if ( $this ->distinct) { $query .= 'DISTINCT ' ; } // FIELDS and EXPRESSIONS $fields = array (); foreach ( $this ->tables as $alias => $table ) { if (! empty ( $table [ 'all_fields' ])) { $fields [] = $this ->connection->escapeTable( $alias ) . '.*' ; } } foreach ( $this ->fields as $field ) { // Always use the AS keyword for field aliases, as some // databases require it (e.g., PostgreSQL). $fields [] = (isset( $field [ 'table' ]) ? $this ->connection->escapeTable( $field [ 'table' ]) . '.' : '' ) . $this ->connection->escapeField( $field [ 'field' ]) . ' AS ' . $this ->connection->escapeAlias( $field [ 'alias' ]); } foreach ( $this ->expressions as $expression ) { $fields [] = $expression [ 'expression' ] . ' AS ' . $this ->connection->escapeAlias( $expression [ 'alias' ]); } $query .= implode( ', ' , $fields ); // FROM - We presume all queries have a FROM, as any query that doesn't won't need the query builder anyway. $query .= "\nFROM " ; foreach ( $this ->tables as $table ) { $query .= "\n" ; if (isset( $table [ 'join type' ])) { $query .= $table [ 'join type' ] . ' JOIN ' ; } // If the table is a subquery, compile it and integrate it into this query. if ( $table [ 'table' ] instanceof SelectInterface) { // Run preparation steps on this sub-query before converting to string. $subquery = $table [ 'table' ]; $subquery ->preExecute(); $table_string = '(' . (string) $subquery . ')' ; } else { $table_string = $this ->connection->escapeTable( $table [ 'table' ]); // Do not attempt prefixing cross database / schema queries. if ( strpos ( $table_string , '.' ) === FALSE) { $table_string = '{' . $table_string . '}' ; } } // Don't use the AS keyword for table aliases, as some // databases don't support it (e.g., Oracle). $query .= $table_string . ' ' . $this ->connection->escapeTable( $table [ 'alias' ]); if (! empty ( $table [ 'condition' ])) { $query .= ' ON ' . (string) $table [ 'condition' ]; } } // WHERE if ( count ( $this ->condition)) { // There is an implicit string cast on $this->condition. $query .= "\nWHERE " . $this ->condition; } // GROUP BY if ( $this ->group) { $query .= "\nGROUP BY " . implode( ', ' , $this ->group); } // HAVING if ( count ( $this ->having)) { // There is an implicit string cast on $this->having. $query .= "\nHAVING " . $this ->having; } // UNION is a little odd, as the select queries to combine are passed into // this query, but syntactically they all end up on the same level. if ( $this ->union) { foreach ( $this ->union as $union ) { $query .= ' ' . $union [ 'type' ] . ' ' . (string) $union [ 'query' ]; } } // ORDER BY if ( $this ->order) { $query .= "\nORDER BY " ; $fields = array (); foreach ( $this ->order as $field => $direction ) { $fields [] = $this ->connection->escapeField( $field ) . ' ' . $direction ; } $query .= implode( ', ' , $fields ); } // RANGE // There is no universal SQL standard for handling range or limit clauses. // Fortunately, all core-supported databases use the same range syntax. // Databases that need a different syntax can override this method and // do whatever alternate logic they need to. if (! empty ( $this ->range)) { $query .= "\nLIMIT " . (int) $this ->range[ 'length' ] . " OFFSET " . (int) $this ->range[ 'start' ]; } if ( $this ->forUpdate) { $query .= ' FOR UPDATE' ; } return $query ; } |
Please login to continue.